home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 September / CHIP Eylül 1998.iso / Slackwar / docs / Bootdisk-HOWTO < prev    next >
Text File  |  1997-04-16  |  94KB  |  2,294 lines

  1.   The Linux Bootdisk HOWTO
  2.   Tom Fawcett and Graham Chapman
  3.   v2.3, 4 April 1997
  4.  
  5.   This document describes how to create Linux boot, boot/root and util¡
  6.   ity maintenance disks. These disks could be used as rescue disks or to
  7.   test new kernels.  Note: if you haven't read the Linux FAQ and related
  8.   documents such as the Linux Installation HOWTO and the Linux Install
  9.   Guide, then you should not be trying to build boot diskettes.
  10.  
  11.   1.  Introduction
  12.  
  13.   1.1.  Why Build Boot Disks?
  14.  
  15.   Linux boot disks are useful in a number of situations, such as:
  16.  
  17.   ╖  Testing a new kernel.
  18.  
  19.   ╖  Recovering from disk or system failure. Such a failure could be
  20.      anything from a lost boot sector to a disk head crash.
  21.  
  22.   There are several ways of obtaining boot disks:
  23.  
  24.   ╖  Use one from a distribution such as Slackware. This will at least
  25.      allow you to boot.
  26.  
  27.   ╖  Use a rescue package to set up disks designed to be used as rescue
  28.      disks.
  29.  
  30.   ╖  Learn what is required for each of the various types of disk to
  31.      operate, then build your own.
  32.  
  33.   I originally chose the last option - learn how it works so that you
  34.   can do it yourself. That way, if something breaks, you can work out
  35.   what to do to fix it. Plus you learn a lot about how Linux works along
  36.   the way.
  37.  
  38.   Experienced Linux users may find little of use in this document.
  39.   However users new to Linux system administration who wish to protect
  40.   against root disk loss and other mishaps may find it useful.
  41.  
  42.   A note on versions - this document has been updated to support the
  43.   following packages and versions:
  44.  
  45.   ╖  Linux 2.0.6
  46.  
  47.   ╖  LILO 0.19
  48.  
  49.   Copyright (c) Tom Fawcett and Graham Chapman 1995, 1996, 1997.
  50.  
  51.   Permission is granted for this material to be freely used and
  52.   distributed, provided the source is acknowledged.  The copyright
  53.   conditions are intended to be no more restrictive than version 2 of
  54.   the GNU General Public License as published by the Free Software
  55.   Foundation.
  56.  
  57.   No warranty of any kind is provided. You use this material at your own
  58.   risk.
  59.  
  60.   1.2.  Feedback and Credits
  61.  
  62.   We welcome any feedback, good or bad, on the content of this document.
  63.   Please let us know if you find any errors or omissions. Send comments,
  64.   corrections and questions to Tom Fawcett (fawcett@nynexst.com) or
  65.   Graham Chapman (grahamc@zeta.org.au).
  66.  
  67.   We thank the following people for correcting errors and providing
  68.   useful suggestions for improvement:
  69.  
  70.                Randolph Bentson
  71.                Grant R. Bowman
  72.                Scott Burkett
  73.                Cameron Davidson
  74.                Bruce Elliot
  75.                Javier Ros Ganuza
  76.                HARIGUCHI Youichi
  77.                Duncan Hill
  78.                Bjxrn-Helge Mevik
  79.                Lincoln S. Peck
  80.                Dwight Spencer
  81.                Cameron Spitzer
  82.                Johannes Stille
  83.  
  84.   1.3.  Change History
  85.  
  86.   v.2.3, 4 April 1997.  Changes in this version:
  87.  
  88.   ╖  Moved first FAQ question ("Why doesn't my disk boot?")  into its
  89.      own section ("Troubleshooting") and added Yard troubleshooting
  90.      information to it.
  91.  
  92.   ╖  Made a few changes suggested by D.Hill and J.R.Ganuza.
  93.  
  94.   ╖  Added ref and label tags in various places.
  95.  
  96.   ╖  Moved scripts and resources to appendices.
  97.  
  98.   ╖  Added URLs for distributions' bootdisks plus mirrors.
  99.  
  100.   v2.2, 1 September 1996. Changes in this version:
  101.  
  102.   ╖  Fix: set ramdisk word via rdev on /dev/fd0 instead of zImage.
  103.  
  104.   v2.1, 18 August 1996. Changes in this version:
  105.  
  106.   Summary: this was a major cleanup to reflect changes between kernel
  107.   version 1.2 and 2.0. Specific changes are:
  108.  
  109.   ╖  Chg: replaced shell scripts and directory listings.
  110.  
  111.   ╖  Chg: removed most of the text of "oversize ramdisk" FAQ question.
  112.  
  113.   ╖  Fix: mkfs -i should have been mke2fs -i.
  114.  
  115.   ╖  Fix: missing parameter name in dd command to zero rootdisk device.
  116.  
  117.   ╖  Fix: remove accidental extra parameter from mke2fs command to
  118.      create rootdisk filesystem.
  119.  
  120.   ╖  Chg: minor changes to reflect less reliance on the Bootkit utility.
  121.  
  122.   ╖  Chg: change section cross-references to refer to section title, not
  123.      number (sometime I'll add hypertext links...)
  124.  
  125.   ╖  Add: use cpio as an alternate way of copying files.
  126.  
  127.   ╖  Add: tips for removing unnecessary device special files.
  128.  
  129.   ╖  Add: FAQ question - what to do if nothing happens at boot time.
  130.  
  131.   ╖  Add: various minor changes.
  132.  
  133.   v2.0, 12 June 1996. Changes in this version:
  134.  
  135.   ╖  Add: additional author and maintainer, Tom Fawcett.
  136.  
  137.   ╖  Add: section 6.3, Ramdisk Usage.
  138.  
  139.   ╖  Add: section titled Advanced Bootdisk Creation, which describes how
  140.      to take advantage of ramdisk changes in kernels 1.3.48+
  141.  
  142.   ╖  Chg: rewrite section on /lib directory.
  143.  
  144.   ╖  Chg: various minor tips on changed ramdisk usage.
  145.  
  146.   Version history:
  147.  
  148.   ╖  v1.02, 25 June 1995 - minor changes.
  149.  
  150.   ╖  v1.01, 6 February 1995 - minor changes.
  151.  
  152.   ╖  v1.0, 2 January 1995 - first release in standard HOWTO layout.
  153.  
  154.   ╖  v0.10, 1 Novemer 1994 - original version, labelled "Draft".
  155.  
  156.   2.  Disks
  157.  
  158.   2.1.  Summary of Disk Types
  159.  
  160.   I classify boot-related disks into four types. The discussion here and
  161.   throughout this document uses the term "disk" to refer to diskettes
  162.   unless otherwise specified. Most of the discussion could be equally
  163.   well applied to hard disks.
  164.  
  165.   A summary of disk types and uses is:
  166.  
  167.      boot
  168.         A disk containing a kernel which can be booted. The disk can
  169.         contain a filesystem and use a boot loader to boot, or it can
  170.         simply contain the kernel only at the start of the disk.  The
  171.         disk can be used to boot the kernel using a root file system on
  172.         another disk. This could be useful if you lost your boot loader
  173.         due to, for example, an incorrect installation attempt.
  174.  
  175.      root
  176.         A disk with a file system containing everything required to run
  177.         a Linux system. It does not necessarily contain either a kernel
  178.         or a boot loader.
  179.  
  180.         This disk can be used to run the system independently of any
  181.         other disks, once the kernel has been booted. A special kernel
  182.         feature allows a separate root disk to be mounted after booting,
  183.         with the root disk being automatically copied to a ramdisk.
  184.  
  185.         You could use this type of disk to check another disk for
  186.         corruption without mounting it, or to restore another disk after
  187.         a disk failure or loss of files.
  188.  
  189.      boot/root
  190.         A disk which is the same as a root disk, but contains a kernel
  191.         and a boot loader. It can be used to boot from, and to run the
  192.         system. The advantage of this type of disk is that is it compact
  193.         - everything required is on a single disk.  However the
  194.         gradually increasing size of everything means that it won't
  195.         necessarily always be possbile to fit everything on a single
  196.         diskette, even with compression.
  197.  
  198.      utility
  199.         A disk which contains a file system, but is not intended to be
  200.         mounted as a root file system. It is an additional data disk.
  201.         You would use this type of disk to carry additional utilities
  202.         where you have too much to fit on your root disk.
  203.  
  204.         The term "utility" only really applies to diskettes, where you
  205.         would use a utility disk to store additional recovery utility
  206.         software.
  207.  
  208.   The most flexible approach for rescue diskettes is probably to use
  209.   separate boot and root diskettes, and one or more utility diskettes to
  210.   handle the overflow.
  211.  
  212.   2.2.  Boot
  213.  
  214.   2.2.1.  Overview
  215.  
  216.   All PC systems start the boot process by executing code in ROM to load
  217.   the sector from sector 0, cylinder 0 of the boot drive and try and
  218.   execute it. On most bootable disks, sector 0, cylinder 0 contains
  219.   either:
  220.  
  221.   ╖  code from a boot loader such as LILO, which locates the kernel,
  222.      loads it and executes it to start the boot proper.
  223.  
  224.   ╖  the start of an operating system kernel, such as Linux.
  225.  
  226.   If a Linux kernel has been written to a diskette as a raw device, then
  227.   the first sector will be the first sector of the Linux kernel itself,
  228.   and this sector will continue the boot process by loading the rest of
  229.   the kernel and running Linux. For a more detailed description of the
  230.   boot sector contents, see the documentation in lilo-01.5 or higher.
  231.  
  232.   An alternative method of storing a kernel on a boot disk is to create
  233.   a filesystem, not as a root filesystem, but simply as a means of
  234.   installing LILO and thus allowing boot-time command line options to be
  235.   specified. For example, the same kernel could then be used to boot
  236.   using a hard disk root filesystem, or a diskette root filesystem. This
  237.   could be useful if you were trying to rebuild the hard disk
  238.   filesystem, and wanted to repeatedly test results.
  239.  
  240.   2.2.2.  Setting Pointer to Root
  241.  
  242.   The kernel must somehow obtain a pointer to the drive and partititon
  243.   to be mounted as the root drive. This can be provided in several ways:
  244.  
  245.   ╖  By setting ROOT_DEV = devicename in the Linux kernel makefile and
  246.      rebuilding the kernel (for advice on how to rebuild the kernel,
  247.      read the Linux FAQ and look in /usr/src/linux). Comments in the
  248.      Linux makefile describe the valid values for devicename.
  249.  
  250.   ╖  By running the rdev utility:
  251.  
  252.                rdev filename devicename
  253.  
  254.   This will set the root device of the kernel contained in filename to
  255.   be devicename. For example:
  256.  
  257.                rdev zImage /dev/sda1
  258.  
  259.   This sets the root device in the kernel in zImage to the first parti¡
  260.   tion on the first SCSI drive.
  261.  
  262.   There are some alternative ways of issuing the rdev command. Try:
  263.  
  264.                rdev -h
  265.  
  266.   and it will display command usage.
  267.  
  268.   There is usually no need to configure the root device for boot
  269.   diskette use, because the kernel currently used to boot from probably
  270.   already points to the root drive device. The need can arise, howoever,
  271.   if you obtain a kernel from another machine, for example, from a
  272.   distribution, or if you want to use the kernel to boot a root
  273.   diskette. It is probably a good idea to check the current root drive
  274.   setting, just in case it is wrong. To get rdev to check the current
  275.   root device in a kernel file, enter the command:
  276.  
  277.                rdev <filename>
  278.  
  279.   It is possible to change the root device set in a kernel by means
  280.   other than using rdev. For details, see the FAQ at the end of this
  281.   document.
  282.  
  283.   2.2.3.  Copying Kernel to Boot Diskette
  284.  
  285.   Once the kernel has been configured it must be copied to the boot
  286.   diskette.
  287.   The commands described below (and throughout the HOWTO) assume that
  288.   the diskettes have been formatted. If not, then use fdformat to format
  289.   the diskettes before continuing.
  290.  
  291.   If the disk is not intended to contain a file system, then the kernel
  292.   can be copied using the dd command, as follows:
  293.  
  294.                dd if=infilename of=devicename
  295.  
  296.                where   infilename is the name of the kernel
  297.                and     devicename is the diskette raw device,
  298.                        usually /dev/fd0
  299.  
  300.   The cp command can also be used:
  301.  
  302.                cp filename devicename
  303.  
  304.   For example:
  305.  
  306.                dd if=zImage of=/dev/fd0
  307.        or
  308.                cp zImage /dev/fd0
  309.  
  310.   The seek parameter to the dd command should NOT be used. The file must
  311.   be copied to start at the boot sector (sector 0, cylinder 0), and
  312.   omitting the seek parameter will do this.
  313.  
  314.   The output device name to be used is usually /dev/fd0 for the primary
  315.   diskette drive (i.e. drive "A:" in DOS), and /dev/fd1 for the
  316.   secondary. These device names will cause the kernel to autodetect the
  317.   attributes of the drives. Drive attributes can be specified to the
  318.   kernel by using other device names: for example /dev/fd0H1440
  319.   specifies a high density 1.44 Mb drive. It is rare to need to use
  320.   these specific device names.
  321.  
  322.   Where the kernel is to be copied to a boot disk containing a
  323.   filesystem, then the disk is mounted at a suitable point in a
  324.   currently-mounted filesystem, then the cp command is used. For
  325.   example:
  326.  
  327.                mount -t ext2 /dev/fd0 /mnt
  328.                cp zImage /mnt
  329.                umount /mnt
  330.  
  331.   Note that for almost all operations in this HOWTO, the user should be
  332.   operating as the superuser.
  333.  
  334.   2.3.  Root
  335.  
  336.   2.3.1.  Overview
  337.  
  338.   A root disk contains a complete working Linux system, but without
  339.   necessarily including a kernel. In other words, the disk may not be
  340.   bootable, but once the kernel is running, the root disk contains
  341.   everything needed to support a full Linux system. To be able to do
  342.   this, the disk must include the minimum requirements for a Linux
  343.   system:
  344.  
  345.   ╖  File system.
  346.  
  347.   ╖  Minimum set of directories - dev, proc, bin, etc, lib, usr, tmp.
  348.  
  349.   ╖  Basic set of utilities - bash (to run a shell), ls, cp etc.
  350.  
  351.   ╖  Minimum set of config files - rc, inittab, fstab etc.
  352.  
  353.   ╖  Runtime library to provide basic functions used by utilities.
  354.  
  355.   Of course, any system only becomes useful when you can run something
  356.   on it, and a root diskette usually only becomes useful when you can do
  357.   something like:
  358.  
  359.   ╖  Check a file system on another drive, for example to check your
  360.      root file system on your hard drive, you need to be able to boot
  361.      Linux from another drive, as you can with a root diskette system.
  362.      Then you can run fsck on your original root drive while it is not
  363.      mounted.
  364.  
  365.   ╖  Restore all or part of your original root drive from backup using
  366.      archive/compression utilities including cpio, tar, gzip and ftape.
  367.  
  368.   2.4.  Boot/Root
  369.  
  370.   This is essentially the same as the root disk, with the addition of a
  371.   kernel and a boot loader such as LILO.
  372.  
  373.   With this configuration, a kernel file is copied to the root file
  374.   system, and LILO is then run to install a configuration which points
  375.   to the kernel file on the target disk. At boot time, LILO will boot
  376.   the kernel from the target disk.
  377.  
  378.   Several files must be copied to the diskette for this method to work.
  379.   Details of these files and the required LILO configuration, including
  380.   a working sample, are given below in the section titled "LILO".
  381.  
  382.   2.4.1.  RAM Disks and Root Filesystems on Diskette
  383.  
  384.   For a diskette root filesystem to be efficient, you need to be able to
  385.   run it from a ramdisk, i.e. an emulated disk drive in main memory.
  386.   This avoids having the system run at a snail's pace, which a diskette
  387.   would impose. The Ftape HOWTO states that a ramdisk will be required
  388.   when using Ftape because Ftape requires exclusive use of the diskette
  389.   controller.
  390.  
  391.   There is an added benefit from using a ramdisk - the Linux kernel
  392.   includes an automatic ramdisk root feature, whereby it will, under
  393.   certain circumstances, automatically copy the contents of a root
  394.   diskette to a ramdisk, and then switch the root drive to be the
  395.   ramdisk instead of the diskette. This has three major benefits:
  396.  
  397.   ╖  The system runs a lot faster.
  398.  
  399.   ╖  The diskette drive is freed up to allow other diskettes to be used
  400.      on a single-diskette drive system.
  401.  
  402.   ╖  With compression, the ramdisk image on a disk can be substantially
  403.      smaller than (eg, 40% the size of) the corresponding disk image.
  404.      This means that a 1.44 meg floppy disk may hold a root containing
  405.      roughly 3.6 meg.
  406.  
  407.   For kernels 1.3.48+, the ramdisk code was substantially rewritten.
  408.   You have some more options and the commands for using the ramdisk are
  409.   somewhat different.  Section ``Advanced Bootdisk Creation'', below,
  410.   discusses how to take advantage of these.
  411.  
  412.   You must configure your kernel to have ramdisk support, but the
  413.   ramdisk is dynamically expandible so you need not specify the size.
  414.   rdev -r is no longer used to specify the ramdisk size, but instead
  415.   sets a ramdisk word in the kernel image.  Section ``Advanced Bootdisk
  416.   Creation'' discusses this in more detail.
  417.  
  418.   If you have a kernel before 1.3.48, the following requirements apply.
  419.   Note that this applies ONLY to kernels prior to 1.3.48.
  420.  
  421.   ╖  The file system on the diskette drive must be either a minix or an
  422.      ext2 file system. The ext2 file system is generally the preferred
  423.      file system to use. Note that if you have a Linux kernel earlier
  424.      than 1.1.73, then you should see the comments in the section titled
  425.      "File Systems" to see whether your kernel will support ext2. If
  426.      your kernel is old then you may have to use minix. This will not
  427.      cause any significant problems.
  428.  
  429.   ╖  A ramdisk must be configured into the kernel, and it must be at
  430.      least as big as the diskette drive.
  431.  
  432.   A ramdisk can be configured into the kernel in several ways:
  433.  
  434.   ╖  By uncommenting the RAMDISK macro in the Linux kernel makefile, so
  435.      that it reads:
  436.  
  437.                RAMDISK = -DRAMDISK=1440
  438.  
  439.   to define a ramdisk of 1440 1K blocks, the size of a high-density
  440.   diskette.
  441.  
  442.   ╖  By running the rdev utility, available on most Linux systems. This
  443.      utility displays or sets values for several things in the kernel,
  444.      including the desired size for a ramdisk. To configure a ramdisk of
  445.      1440 blocks into a kernel in a file named zImage, enter:
  446.  
  447.                rdev -r zImage 1440
  448.  
  449.   this might change in the future, of course. To see what your version
  450.   of rdev does, enter the command:
  451.  
  452.                rdev -h
  453.  
  454.   and it should display its options.
  455.  
  456.   ╖  By using the boot loader package LILO to configure it into your
  457.      kernel at boot time. This can be done using the LILO configuration
  458.      parameter:
  459.  
  460.                ramdisk = 1440
  461.  
  462.   to request a ramdisk of 1440 1K blocks at boot time.
  463.  
  464.   ╖  By interrupting a LILO automatic boot and adding ramdisk=1440 to
  465.      the command line. For example, such a command line might be:
  466.  
  467.                zImage ramdisk=1440
  468.  
  469.   See the section on LILO for more details.
  470.  
  471.   ╖  By editing the kernel file and altering the values near the start
  472.      of the file which record the ramdisk size. This is definitely a
  473.      last resort, but can be done. See the FAQ near the end of this
  474.      document for more details.
  475.  
  476.   The easiest of these methods is LILO configuration, because you need
  477.   to set up a LILO configuration file anyway, so why not add the ramdisk
  478.   size here?
  479.  
  480.   LILO configuration is briefly described in a section titled "LILO"
  481.   below, but it is advisable to obtain the latest stable version of LILO
  482.   from your nearest Linux mirror site, and read the documentation that
  483.   comes with it.
  484.  
  485.   Ramdisks can be made larger than the size of a diskette, and made to
  486.   contain a filesystem as large as the ramdisk. This can be useful to
  487.   load all the software required for rescue work onto a single high-
  488.   performance ramdisk. The method of doing this is described in the FAQ
  489.   section under the question "How can I create an oversize ramdisk
  490.   filesystem?"
  491.  
  492.   2.5.  Utility
  493.  
  494.   Often one disk is not sufficient to hold all the software you need to
  495.   be able to perform rescue functions of analysing, repairing and
  496.   restoring corrupted disk drives. By the time you include tar, gzip
  497.   e2fsck, fdisk, Ftape and so on, there is enough for a whole new
  498.   diskette, maybe even more if you want lots of tools.
  499.  
  500.   This means that a rescue set often requires a utility diskette, with a
  501.   file system containing any extra files required. This file system can
  502.   then be mounted at a convenient point, such as /usr, on the boot/root
  503.   system.
  504.  
  505.   Creating a file system is fairly easy, and is described in the section
  506.   titled "File Systems".
  507.  
  508.   3.  Components
  509.  
  510.   3.1.  File Systems
  511.  
  512.   The Linux kernel now supports two file system types for root disks to
  513.   be automatically copied to ramdisk.  These are minix and ext2, of
  514.   which ext2 is the preferred file system.  The ext2 support was added
  515.   sometime between 1.1.17 and 1.1.57, I'm not sure exactly which.  If
  516.   you have a kernel within this range then edit
  517.   /usr/src/linux/drivers/block/ramdisk.c and look for the word "ext2".
  518.   If it is not found, then you will have to use a minix file system, and
  519.   therefore the "mkfs" command to create it.  If using ext2, then you
  520.   may find it useful to use the -i option to specify more inodes than
  521.   the default; -i 2000 is suggested so that you don't run out of inodes.
  522.   Alternatively, you can save on inodes by removing lots of unnecessary
  523.   /dev files.  Mke2fs will by default create 360 inodes on a 1.44Mb
  524.   diskette.  I find that 120 inodes is ample on my current rescue root
  525.   diskette, but if you include all the devices in the /dev directory
  526.   then you will easily exceed 360.  Using a compressed root filesystem
  527.   allows a larger filesystem, and hence more inodes by default, but you
  528.   may still need to either reduce the number of files or increase the
  529.   number of inodes.
  530.  
  531.   To create an ext2 file system on a diskette on my system, I issue the
  532.   following command:
  533.  
  534.                mke2fs -m 0 /dev/fd0
  535.  
  536.   The mke2fs command will automatically detect the space available and
  537.   configure itself accordingly.  If desired, the diskette size in 1Kb
  538.   blocks can be specified to speed up mke2fs operation.  The -m 0
  539.   parameter prevents it from reserving space for root, and hence
  540.   provides more usable space on the disk.
  541.  
  542.   An easy way to test the result is to create a system using the above
  543.   command or similar, and then attempt to mount the diskette.   If it is
  544.   an ext2 system, then the command:
  545.  
  546.                mount -t ext2 /dev/fd0 /<mount point>
  547.  
  548.   should work.
  549.  
  550.   3.2.  Kernel
  551.  
  552.   3.2.1.  Building a Custom Kernel
  553.  
  554.   In most cases it would be possible to copy your current kernel and
  555.   boot the diskette from that.  However there may be cases where you
  556.   wish to build a separate one.
  557.  
  558.   One reason is size.  The kernel is one of the largest files in a
  559.   minimum system, so if you want to build a boot/root diskette, then you
  560.   will have to reduce the size of the kernel as much as possible.  The
  561.   kernel now supports changing the diskette after booting and before
  562.   mounting root, so it is not necessary any more to squeeze the kernel
  563.   into the same disk as everything else, therefore these comments apply
  564.   only if you choose to build a boot/root diskette.
  565.  
  566.   There are two ways of reducing kernel size:
  567.  
  568.   ╖  Building it with the minumum set of facilities necessary to support
  569.      the desired system. This means leaving out everything you don't
  570.      need. Networking is a good thing to leave out, as well as support
  571.      for any disk drives and other devices which you don't need when
  572.      running your boot/root system.
  573.  
  574.   ╖  Compressing it, using the standard compressed-kernel option
  575.      included in the makefile:
  576.  
  577.                make zImage
  578.  
  579.   Refer to the documentation included with the kernel source for up-to-
  580.   date information on building compressed kernels.  Note that the kernel
  581.   source is usually in /usr/src/linux.
  582.  
  583.   Having worked out a minimum set of facilities to include in a kernel,
  584.   you then need to work out what to add back in. Probably the most
  585.   common uses for a boot/root diskette system would be to examine and
  586.   restore a corrupted root file system, and to do this you may need
  587.   kernel support.
  588.  
  589.   For example, if your backups are all held on tape using Ftape to
  590.   access your tape drive, then, if you lose your current root drive and
  591.   drives containing Ftape, then you will not be able to restore from
  592.   your backup tapes. You will have to reinstall Linux, download and
  593.   reinstall Ftape, and then try and read your backups.
  594.  
  595.   It is probably desirable to maintain a copy of the same version of
  596.   backup utilities used to write the backups, so that you don't waste
  597.   time trying to install versions that cannot read your backup tapes.
  598.  
  599.   The point here is that, whatever I/O support you have added to your
  600.   kernel to support backups should also be added into your boot/root
  601.   kernel.
  602.  
  603.   The procedure for actually building the kernel is described in the
  604.   documentation that comes with the kernel.  It is quite easy to follow,
  605.   so start by looking in /usr/src/linux.  Note that if you have trouble
  606.   building a kernel, then you should probably not attempt to build
  607.   boot/root systems anyway.
  608.  
  609.   3.3.  Devices
  610.  
  611.   A /dev directory containing a special file for all devices to be used
  612.   by the system is mandatory for any Linux system.  The directory itself
  613.   is a normal directory, and can be created with the mkdir command in
  614.   the normal way.  The device special files, however, must be created in
  615.   a special way, using the mknod command.
  616.  
  617.   There is a shortcut, though --- copy your existing /dev directory
  618.   contents, and delete the ones you don't want. The only requirement is
  619.   that you copy the device special files using the -R option.   (--
  620.   Warning: The cp command supplied with the most recent version of
  621.   fileutils (3.13) is reported not to respect the -R flag.--)
  622.   This will copy the directory without attempting to copy the contents
  623.   of the files. Note that if you use lower caser, as in "-r", there will
  624.   be a vast difference, because you will probably end up copying the
  625.   entire contents of all of your hard disks - or at least as much of
  626.   them as will fit on a diskette! Therefore, take care, and use the
  627.   command:
  628.  
  629.                cp -dpR /dev /mnt
  630.  
  631.   assuming that the diskette is mounted at /mnt.  The dp switches ensure
  632.   that symbolic links are copied as links (rather than the target file
  633.   being copied) and that the original file attributes are preserved,
  634.   thus preserving ownership information.
  635.  
  636.   You can also use the -p option of cpio, because cpio will handle
  637.   device special files correctly, and not try and copy the contents.
  638.   For example:
  639.  
  640.                cd /dev
  641.                find . -print | cpio -pmd /mnt/dev
  642.  
  643.   will copy all device special files from /dev to /mnt/dev. In fact it
  644.   will copy all files in the directory tree starting at /dev, and will
  645.   create any required subdirectories in the target directory tree.
  646.  
  647.   If you want to do it the hard way, use ls -l to display the major and
  648.   minor device numbers for the devices you want, and create them on the
  649.   diskette using mknod.
  650.  
  651.   Many distributions include a shell script called MAKEDEV in the /dev
  652.   directory. This shell script could be used to create the devices, but
  653.   it is probably easier to just copy your existing ones, especially for
  654.   rescue disk purposes.
  655.  
  656.   Whichever way the device directory is copied, it is worth checking
  657.   that any special devices you need have been placed on the rescue
  658.   diskette. For example, Ftape uses tape devices, so you will need to
  659.   copy all of these.
  660.  
  661.   Note that an inode is required for each device special file, and
  662.   inodes can at times be a scarce resource, especially on diskette
  663.   filesystems. It therefore makes sense to remove any device special
  664.   files that you don't need from the diskette /dev directory. Many
  665.   devices are obviously unnecessary on specific systems. For example, if
  666.   you do not have SCSI disks, then you can safely remove all the device
  667.   files starting with "sd". Similarly, if you don't intend to use your
  668.   serial port then all the device files starting with "cua" can go.
  669.  
  670.   3.4.  Directories
  671.  
  672.   It might be possible to get away with just /dev, /proc and /etc to run
  673.   a Linux system. I don't know - I've never tested it. However it will
  674.   certainly be difficult, because without shared libraries all your
  675.   executables would have to be statically linked. A reasonable minimum
  676.   set of directories consists of the following:
  677.  
  678.      /dev
  679.         Required to perform I/O with devices
  680.  
  681.      /proc
  682.         Required by the ps command
  683.  
  684.      /etc
  685.         System configuration files
  686.  
  687.      /bin
  688.         Utility executables considered part of the system
  689.  
  690.      /lib
  691.         Shared libraries to provide run-time support
  692.  
  693.      /mnt
  694.         A mount point for maintenance on other disks
  695.  
  696.      /usr
  697.         Additional utilities and applications
  698.  
  699.   Note that the directory tree presented here is for root diskette use
  700.   only.  Refer to the Linux File System Standard for much better
  701.   information on how file systems should be structured in "standard"
  702.   Linux systems.
  703.  
  704.   Four of these directories can be created very easily:
  705.  
  706.   ╖  /dev is described above in the section titled DEVICES.
  707.  
  708.   ╖  /proc only needs to exist. Once the directory is created using
  709.      mkdir, nothing more is required.
  710.  
  711.   ╖  Of the others, /mnt and /usr are included in this list only as
  712.      mount points for use after the boot/root system is running.  Hence
  713.      again, these directories only need to be created.
  714.  
  715.   The remaining 3 directories are described in the following sections.
  716.  
  717.   3.4.1.  /etc
  718.  
  719.   This directory must contain a number of configuration files. On most
  720.   systems, these can be divided into 3 groups:
  721.  
  722.   ╖  Required at all times, e.g. rc, fstab, passwd.
  723.  
  724.   ╖  May be required, but no-one is too sure.
  725.  
  726.   ╖  Junk that crept in.
  727.  
  728.   Files which are not essential can be identified with the command:
  729.  
  730.                ls -ltru
  731.  
  732.   This lists files in reverse order of date last accessed, so if any
  733.   files are not being accessed, then they can be omitted from a root
  734.   diskette.
  735.  
  736.   On my root diskettes, I have the number of config files down to 15.
  737.   This reduces my work to dealing with three sets of files:
  738.  
  739.   ╖  The ones I must configure for a boot/root system:
  740.  
  741.                rc.d/*  system startup and run level change scripts
  742.                fstab   list of file systems to be mounted
  743.                inittab parameters for the init process - the
  744.                        first process started at boot time.
  745.  
  746.   ╖  the ones I should tidy up for a boot/root system:
  747.  
  748.                passwd  list of logins
  749.                shadow  contains passwords
  750.  
  751.   These should be pruned on secure systems to avoid copying user's pass¡
  752.   words off the system, and so that when you boot from diskette,
  753.   unwanted logins are rejected.  (-- Note that there is a reason not to
  754.   prune passwd and shadow.  Tar (and probably other archivers) stores
  755.   user and group names with files.  If you restore files to your hard
  756.   disk from tape, the files will be restored with their original names.
  757.   If these names do not exist in passwd/group when they are restored,
  758.   the UID/GID will not be correct.--)
  759.  
  760.   ╖  The rest. They work at the moment, so I leave them alone.
  761.  
  762.   Out of this, I only really have to configure two files, and what they
  763.   should contain is surprisingly small.
  764.  
  765.   ╖  rc should contain:
  766.  
  767.                #!/bin/sh
  768.                /etc/mount -av
  769.                /bin/hostname boot_root
  770.  
  771.   and I don't really need to run hostname - it just looks nicer if I do.
  772.   Even mount is actually only needed to mount /proc to support the ps
  773.   command - Linux will run without it, although rescue operations are
  774.   rather limited without mount!
  775.  
  776.   ╖  fstab should contain:
  777.  
  778.                /dev/ram        /               ext2    defaults
  779.                /dev/fd0        /               ext2    defaults
  780.                /proc           /proc           proc    defaults
  781.  
  782.   I don't think that the first entry is really needed, but I find that
  783.   if I leave it out, mount won't mount /proc.
  784.  
  785.   Inittab should be ok as is, unless you want to ensure that users on
  786.   serial ports cannot login. To prevent this, comment out all the
  787.   entries for /etc/getty which include a ttys or ttyS device at the end
  788.   of the line.  Leave in the tty ports so that you can login at the
  789.   console.
  790.  
  791.   Inittab defines what the system will run or rerun in various states
  792.   including startup, move to multi-user mode, powerfail, and others.  A
  793.   point to be careful of here is to carefully check that the commands
  794.   entered in inittab refer to programs which are present and to the
  795.   correct directory. If you place your command files on your rescue disk
  796.   using the sample directory listing in this HOWTO as a guide, and then
  797.   copy your inittab to your rescue disk without checking it, then the
  798.   probability of failure will be quite high, because half of the inittab
  799.   entries will refer to missing programs or to the wrong directory.
  800.  
  801.   It is worth noting here as well that some programs cannot be moved
  802.   from one directory to another or they will fail at runtime because
  803.   they have hardcoded the name of another program which they attempt to
  804.   run. For example on my system, /etc/shutdown has hardcoded in it
  805.   /etc/reboot. If I move reboot to /bin/reboot, and then issue a
  806.   shutdown command, it will fail because it can't find the reboot file.
  807.  
  808.   For the rest, just copy all the text files in your /etc directory,
  809.   plus all the executables in your /etc directory that you cannot be
  810.   sure you do not need. As a guide, consult the sample ls listing in
  811.   "Sample Boot/Root ls-lR Directory Listing" - this is what I have, so
  812.   probably it will be sufficient for you if you copy only those files -
  813.   but note that systems differ a great deal, so you cannot be sure that
  814.   the same set of files on your system is equivalent to the files on
  815.   mine. The only sure method is to start with inittab and work out what
  816.   is required.
  817.  
  818.   Most systems now use an /etc/rc.d directory containing shell scripts
  819.   for different run levels.  The absolute minimum is a single rc script,
  820.   but it will probably be a lot simpler in practice to copy the inittab
  821.   and /etc/rc.d directory from your existing system, and prune the shell
  822.   scripts in the rc.d directory to remove processing not relevent to a
  823.   diskette system environment.
  824.  
  825.   3.4.2.  /bin
  826.  
  827.   Here is a convenient point to place the extra utilities you need to
  828.   perform basic operations, utilities such as ls, mv, cat, dd etc.
  829.  
  830.   See the section titled "Sample Boot/Root ls-lR Directory Listing" for
  831.   the list of files that I place in my boot/root /bin directory. You may
  832.   notice that it does not include any of the utilities required to
  833.   restore from backup, such as cpio, tar, gzip etc. That is because I
  834.   place these on a separate utility diskette, to save space on the
  835.   boot/root diskette. Once I have booted my boot/root diskette, it then
  836.   copies itself to the ramdisk leaving the diskette drive free to mount
  837.   another diskette, the utility diskette. I usually mount this as /usr.
  838.  
  839.   Creation of a utility diskette is described below in the section
  840.   titled "Adding Utility Diskettes".
  841.  
  842.   3.4.3.  /lib
  843.  
  844.   In /lib you place necessary shared libraries and loaders.  If the
  845.   necessary libraries are not found in your /lib directory then the
  846.   system will be unable to boot. If you're lucky you may see an error
  847.   message telling you why.
  848.  
  849.   Nearly every program requires at least the libc library:
  850.  
  851.                libc.so.X
  852.  
  853.   where X is the current version number.  Check your /lib directory.
  854.   Note that libc.so.4 may be a symlink to a libc library with version
  855.   number in the filename. If you issue the command:
  856.  
  857.                ls -l /lib
  858.  
  859.   you will see something like:
  860.  
  861.                libc.so.4 -> libc.so.4.5.21
  862.  
  863.   In this case, the libc library you want is libc.so.4.5.21. This is an
  864.   example only - the ELF libc library is currently libc.so.5.xxxx.
  865.  
  866.   To find other libraries you should go through all the binaries you
  867.   plan to include and check their dependencies.  You can do this with
  868.   ldd command.  For example, on my system the command:
  869.  
  870.                ldd /bin/mount
  871.  
  872.   produces the output:
  873.  
  874.                /bin/mount:
  875.                        libc.so.5 => /lib/libc.so.5.2.18
  876.  
  877.   indicating that /bin/mount needs the library libc.so.5, which is a
  878.   symbolic link to libc.so.5.2.18.
  879.  
  880.   In /lib you must also include one or more loaders to load the
  881.   libraries.  The loader file is either ld.so (for a.out libraries) or
  882.   ld-linux.so (for ELF libraries).  If you're not sure which you need,
  883.   run the "file" command on the library.  For example, on my system:
  884.  
  885.                file /lib/libc.so.5.2.18
  886.  
  887.   tells me:
  888.  
  889.           /lib/libc.so.5.2.18: ELF 32-bit LSB shared object ...
  890.  
  891.   so it needs an ELF loader.  If you have an a.out library you'll
  892.   instead see something like:
  893.  
  894.                /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC) ...
  895.  
  896.   Copy the specific loader(s) you need.
  897.  
  898.   Libraries and loaders should be checked carefully against the included
  899.   binaries.  If the kernel cannot load a necessary library, the kernel
  900.   will usually hang with no error message.
  901.  
  902.   3.5.  LILO
  903.  
  904.   3.5.1.  Overview
  905.  
  906.   For the boot/root to be any use, it must be bootable. To achieve this,
  907.   the easiest way is to install a boot loader, which is a piece of
  908.   executable code stored at sector 0, cylinder 0 of the diskette. See
  909.   the section above titled "BOOT DISKETTE" for an overview of the boot
  910.   process.
  911.  
  912.   LILO is a tried and trusted boot loader available from any Linux
  913.   mirror site. It allows you to configure the boot loader, including:
  914.  
  915.   ╖  Which device is to be mounted as the root drive.
  916.  
  917.   ╖  Whether to use a ramdisk.
  918.  
  919.   3.5.2.  Sample LILO Configuration
  920.  
  921.   This provides a very convenient place to specify to the kernel how it
  922.   should boot. My root/boot LILO configuration file, used with LILO
  923.   0.15, is:
  924.  
  925.        ______________________________________________________________________
  926.        boot = /dev/fd0
  927.        install = ./mnt/boot.b
  928.        map = ./mnt/lilo.map
  929.        delay = 50
  930.        message = ./mnt/lilo.msg
  931.        timeout = 150
  932.        compact
  933.        image = ./mnt/zImage
  934.                ramdisk = 1440
  935.                root = /dev/fd0
  936.        ______________________________________________________________________
  937.  
  938.   Note that I have not tested this recently, because I no longer use
  939.   LILO-based boot/root diskettes. There is no reason to suppose that it
  940.   does not still work, but if you try it and it fails, you must read the
  941.   LILO documentation to find out why.
  942.  
  943.   Note also that boot/root systems no longer rely on LILO, because since
  944.   1.3.48, the kernel supports loading a compressed root filesystem from
  945.   the same diskette as the kernel. See section ``Advanced Bootdisk
  946.   Creation'' for details.
  947.  
  948.   If you have a kernel later than 1.3.48, the "ramdisk = 1440" line is
  949.   unnecessary and should be removed.
  950.  
  951.   Note that boot.b, lilo.msg and the kernel must first have been copied
  952.   to the diskette using a command similar to:
  953.  
  954.        ______________________________________________________________________
  955.        cp /boot/boot.b ./mnt
  956.        ______________________________________________________________________
  957.  
  958.   If this is not done, then LILO will not run correctly at boot time if
  959.   the hard disk is not available, and there is little point setting up a
  960.   rescue disk which requires a hard disk in order to boot.
  961.  
  962.   I run lilo using the command:
  963.  
  964.                /sbin/lilo -C <configfile>
  965.  
  966.   I run it from the directory containing the mnt directory where I have
  967.   mounted the diskette. This means that I am telling LILO to install a
  968.   boot loader on the boot device (/dev/fd0 in this case), to boot a
  969.   kernel in the root directory of the diskette.
  970.  
  971.   I have also specified that I want the root device to be the diskette,
  972.   and I want a ramdisk created of 1440 1K blocks, the same size as the
  973.   diskette. Since I have created an ext2 file system on the diskette,
  974.   this completes all the conditions required for Linux to automatically
  975.   switch the root device to the ramdisk, and copy the diskette contents
  976.   there as well.
  977.  
  978.   The ramdisk features of Linux are described further in the section
  979.   above titled "RAM DISKS AND BOOT/ROOT SYSTEMS".
  980.  
  981.   It is also worth considering using the "single" parameter to cause
  982.   Linux to boot in single-user mode. This could be useful to prevent
  983.   users logging in on serial ports.
  984.  
  985.   I also use the "DELAY" "MESSAGE" and "TIMEOUT" statements so that when
  986.   I boot the disk, LILO will give me the opportunity to enter command
  987.   line options if I wish. I don't need them at present, but I never know
  988.   when I might want to set a different root device or mount a filesystem
  989.   read-only.
  990.  
  991.   The message file I use contains the message:
  992.  
  993.   Linux Boot/Root Diskette
  994.   ========================
  995.  
  996.   Enter a command line of the form:
  997.  
  998.         zImage [ command-line options]
  999.  
  1000.   If nothing is entered, linux will be loaded with
  1001.   defaults after 15 seconds.
  1002.  
  1003.   This is simply a reminder to myself what my choices are.
  1004.  
  1005.   Readers are urged to read the LILO documentation carefully before
  1006.   atttempting to install anything. It is relatively easy to destroy
  1007.   partitions if you use the wrong "boot = " parameter. If you are
  1008.   inexperienced, do NOT run LILO until you are sure you understand it
  1009.   and you have triple-checked your parameters.
  1010.  
  1011.   Note that you must re-run LILO every time you change the kernel, so
  1012.   that LILO can set up its map file to correctly describe the new kernel
  1013.   file. It is in fact possible to replace the kernel file with one which
  1014.   is almost identical without rerunning LILO, but it is far better not
  1015.   to gamble - if you change the kernel, re-run LILO.
  1016.  
  1017.   3.5.3.  Removing LILO
  1018.  
  1019.   One other thing I might as well add here while I'm on the LILO topic:
  1020.   if you mess up lilo on a drive containing DOS, you can always replace
  1021.   the boot sector with the DOS boot loader by issuing the DOS command:
  1022.  
  1023.                FDISK /MBR
  1024.  
  1025.   where MBR stands for "Master Boot Record". Note that some purists
  1026.   disagree with this, and they may have grounds, but it works.
  1027.  
  1028.   3.5.4.  Useful LILO Options
  1029.  
  1030.   LILO has several useful options which are worth keeping in mind when
  1031.   building boot disks:
  1032.  
  1033.   ╖  Command line options - you can enter command line options to set
  1034.      the root device, ramdisk size (for kernels less than 1.3.48),
  1035.      special device parameters, or other things. If you include the
  1036.      DELAY = nn statement in your LILO configuration file, then LILO
  1037.      will pause to allow you to select a kernel image to boot, and to
  1038.      enter, on the same line, any options.  For example:
  1039.  
  1040.                zImage aha152x=0x340,11,3,1 ro
  1041.  
  1042.   will pass the aha152x parameters through to the aha152x scsi disk
  1043.   driver (provided that driver has been included when the kernel was
  1044.   built) and will ask for the root filesystem to be mounted read-only.
  1045.   ╖  Command line "lock" option - this option asks LILO to store the
  1046.      command line entered as the default command line to be used for all
  1047.      future boots. This is particularly useful where you have a device
  1048.      which cannot be autoselected. By using "lock" you can avoid having
  1049.      to type in the device parameter string every time you boot.  For
  1050.      example:
  1051.  
  1052.                zImage aha152x=0x340,11,3,1 root=/dev/sda8 ro lock
  1053.  
  1054.   ╖  APPEND configuration statement - this allows device parameter
  1055.      strings to be stored in the configuration, as an alternative to
  1056.      using the "lock" command line option. Note that any keywords of the
  1057.      form word=value MUST be enclosed in quotes. For example:
  1058.  
  1059.                APPEND = "aha152x=0x340,11,3,1"
  1060.  
  1061.   ╖  DELAY configuration statement - this pauses for DELAY tenths of
  1062.      seconds and allows the user to interrupt the automatic boot of the
  1063.      default command line, so that the user can enter an alternate
  1064.      command line.
  1065.  
  1066.   4.  Advanced Bootdisk Creation
  1067.  
  1068.   4.1.  Overview
  1069.  
  1070.   Previous sections of this document covered the basics of creating
  1071.   boot/root disks, and are applicable to nearly all kernels up to the
  1072.   present (2.0, the latest stable kernel).
  1073.  
  1074.   Kernels 1.3.48+ involved a substantial rewrite of the ramdisk code,
  1075.   adding significant new capabilities.  These kernels could
  1076.   automatically detect compressed filesystems, uncompress them and load
  1077.   them into the ramdisk on boot-up.  Root filesystems could be placed on
  1078.   a second disk, and as of kernel 1.3.98 or so, ramdisks are dynamically
  1079.   expandable.
  1080.  
  1081.   Altogether, these new capabilities mean that boot disks can contain
  1082.   substantially more than they used to.  With compression, a 1722K disk
  1083.   may now hold up to about 3.5 megs of files.  As anyone who has created
  1084.   bootdisks knows, much time is spent pruning down the file set and
  1085.   finding trimmed-down versions of files that will all fit in a small
  1086.   filesystem.  With the new capabilities this is no longer such a
  1087.   concern.
  1088.  
  1089.   Unfortunately, creating bootdisks to exploit these new features is
  1090.   slightly more difficult now.  To build a compressed filesystem on a
  1091.   floppy, the filesystem has to be built on another device and then
  1092.   compressed and transferred to the floppy.  This means a few more
  1093.   steps.
  1094.  
  1095.   The basic strategy is to create a compressed root filesystem, copy the
  1096.   kernel to the floppy disk, tell the kernel where to find the root
  1097.   filesystem, then copy the compressed root filesystem to the floppy.
  1098.  
  1099.   Here's a simple ASCII drawing of what the disk will look like:
  1100.  
  1101.   |<--- zImage --->|<------ Compressed root filesystem -------->|
  1102.   |________________|____________________________________________|
  1103.                Floppy disk space
  1104.  
  1105.   Here are the steps to create the boot floppy:
  1106.  
  1107.   4.2.  Creating a root filesystem
  1108.  
  1109.   The root filesystem is created pretty much the same way as outlined in
  1110.   Section 2.3 of this document.  The primary difference is that you can
  1111.   no longer create a root filesystem directly on a floppy -- you must
  1112.   create it on a separate device larger than the floppy area it will
  1113.   occupy.
  1114.  
  1115.   4.2.1.  Choosing a device
  1116.  
  1117.   In order to build such a root filesystem, you need a spare device that
  1118.   is large enough.  There are several choices:
  1119.  
  1120.   ╖  If you have an unused hard disk partition that is large enough
  1121.      (several megabytes), this is the easiest solution.  Alternatively,
  1122.      if you have enough physical RAM you can simply turn off swapping
  1123.      and build the filesystem in your swap partition.
  1124.  
  1125.      However, most people don't have a spare partition and can't afford
  1126.      to turn swapping off, so...
  1127.  
  1128.   ╖  Use a loopback device.  A loopback device allows a disk file on an
  1129.      existing filesystem to be treated as a device.  In order to use
  1130.      loopback devices you need specially modified mount and unmount
  1131.      programs.  You can find these at:
  1132.  
  1133.                ftp://ftp.win.tue.nl:/pub/linux/util/mount-2.5X.tar.gz
  1134.  
  1135.   where X is the latest modification letter.
  1136.  
  1137.   If you do not have loop devices (/dev/loop0, /dev/loop1, etc) on your
  1138.   system, you'll have to create them first.  The commands:
  1139.  
  1140.                mknod /dev/loop0 b 7 0
  1141.                mknod /dev/loop1 b 7 1
  1142.                mknod /dev/loop2 b 7 2
  1143.                ...
  1144.  
  1145.   will do this.  You probably only need loop0.
  1146.  
  1147.   One you've installed these special mount/umount binaries, create a
  1148.   temporary file on a hard disk with enough capacity (eg, /tmp/fsfile).
  1149.   You can use a command like
  1150.  
  1151.                dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn
  1152.  
  1153.   to create an nnn-block file.
  1154.  
  1155.   Use the file name in place of DEVICE below.  When you issue a mount
  1156.   command you must include the option "-o loop" to tell mount to use a
  1157.   loopback device.  For example:
  1158.  
  1159.                mount -o loop -t ext2 /tmp/fsfile /mnt
  1160.  
  1161.   will mount /tmp/fsfile (via a loopback device) at the mount point
  1162.   /mnt.  A 'df' will confirm this.
  1163.  
  1164.   ╖  A final option is to use the ramdisk (DEVICE = /dev/ram0 or
  1165.      /dev/ramdisk).  In this case, memory is used to simulate a disk
  1166.      drive.  The ramdisk must be large enough to hold a filesystem of
  1167.      the appropriate size. Check your Lilo configuration file
  1168.      (/etc/lilo.conf) for a line like:
  1169.  
  1170.                RAMDISK_SIZE = nnn
  1171.  
  1172.   which determines how much RAM will be allocated.  The default is
  1173.   4096K.
  1174.  
  1175.   After you've chosen one of these options, prepare the device with:
  1176.  
  1177.                dd if=/dev/zero of=DEVICE bs=1k count=3000
  1178.  
  1179.   This command zeroes out the device.  This step is important because
  1180.   the filesystem on the device will be compressed later, so all unused
  1181.   portions should be filled with zeroes to achieve maximum compression.
  1182.  
  1183.   Next, create the filesystem with:
  1184.  
  1185.                mke2fs -m 0 DEVICE
  1186.  
  1187.   (If you're using a loopback device, the disk file you're using should
  1188.   be supplied in place of this DEVICE.  In this case, mke2fs will ask if
  1189.   you really want to do this; say yes.)
  1190.  
  1191.   Then mount the device:
  1192.  
  1193.                mount -t ext2 DEVICE /mnt
  1194.  
  1195.   Proceed as before, copying files into /mnt, as specified in Section
  1196.   2.3.
  1197.  
  1198.   4.2.2.  Compressing the filesystem
  1199.  
  1200.   After you're done copying files into the root filesystem, you need to
  1201.   copy it back out and compress it.  First, umount it:
  1202.  
  1203.                umount /mnt
  1204.  
  1205.   (Technically you can copy the filesystem without unmounting it first,
  1206.   but that's somewhat dangerous, and bad practice.)
  1207.  
  1208.   Next, copy data off the device to a disk file.  Call the disk file
  1209.   rootfs:
  1210.  
  1211.                dd if=DEVICE of=rootfs bs=1k
  1212.  
  1213.   Then compress it.  Use the '-9' option of gzip for maximal
  1214.   compression:
  1215.  
  1216.                gzip -9 rootfs
  1217.  
  1218.   This may take several minutes.  When it finishes, you'll have a file
  1219.   rootfs.gz that is your compressed root filesystem.
  1220.  
  1221.   If you're tight on disk space you can combine dd and gzip:
  1222.  
  1223.                dd if=DEVICE bs=1k | gzip -9 > rootfs.gz
  1224.  
  1225.   4.3.  Calculating the space
  1226.  
  1227.   At this point, check the space to make sure both the kernel and the
  1228.   root filesystem will fit on the floppy.  An "ls -l" will show how many
  1229.   bytes each occupies; divide by 1024 to determine how many blocks each
  1230.   will need.  For partial blocks, be sure to round up to the next block.
  1231.  
  1232.   For example, if the kernel size is 453281 bytes, it will need
  1233.  
  1234.                ceil(453281 / 1024) = 443
  1235.  
  1236.   blocks, so it will occupy blocks 0-442 on the floppy disk.  The com¡
  1237.   pressed root filesystem will begin at block 443.  Remember this block
  1238.   number for the commands to follow; call it ROOTBEGIN.
  1239.  
  1240.   You must tell the kernel where on the floppy to find the root
  1241.   filesystem.  Inside the kernel image is a ramdisk word that specifies
  1242.   where the root filesystem is to be found, along with other options.
  1243.   The word is defined in /usr/src/linux/arch/i386/kernel/setup.c and is
  1244.   interpreted as follows:
  1245.  
  1246.                bits  0-10:     Offset to start of ramdisk, in 1024 byte blocks
  1247.                                (This is ROOTBEGIN, calculated above)
  1248.                bits 11-13:     unused
  1249.                bit     14:     Flag indicating that ramdisk is to be loaded
  1250.                bit     15:     Flag indicating to prompt for floppy
  1251.  
  1252.   (If bit 15 is set, on boot-up you will be prompted to place a new
  1253.   floppy disk in the drive.  This is necessary for a two-disk boot set,
  1254.   discussed below in the section "Making a two-disk set".  For now, this
  1255.   will be zero.)
  1256.  
  1257.   If the root filesystem is to begin at block 443, the ramdisk word is
  1258.  
  1259.                1BB (hex)       443 (decimal)     (bits 0-10)
  1260.             + 4000 (hex)       Ramdisk load flag (bit 14)
  1261.               ----------
  1262.             = 41BB (hex)
  1263.             =16827 (decimal)
  1264.  
  1265.   This ramdisk word will be set in the kernel image using the "rdev -r"
  1266.   command in the next section.
  1267.  
  1268.   4.4.  Copying files to the floppy
  1269.  
  1270.   At this point you're ready to create the boot floppy.  First copy the
  1271.   kernel:
  1272.  
  1273.                dd if=zImage of=/dev/fd0
  1274.  
  1275.   Next, tell the kernel to find its root filesystem on the floppy:
  1276.  
  1277.                rdev /dev/fd0 /dev/fd0
  1278.  
  1279.   Next, you have to set the ramdisk word in the kernel image now
  1280.   residing on the floppy.  The ramdisk word is set using the "rdev -r"
  1281.   command.  Using the figure calculated above in the section titled
  1282.   "Calculating the space":
  1283.  
  1284.                rdev -r /dev/fd0 16827
  1285.  
  1286.   Finally, place the root filesystem on the floppy after the kernel.
  1287.   The dd command has a seek option that allows you to specify how many
  1288.   blocks to skip:
  1289.  
  1290.                dd if=rootfs.gz of=/dev/fd0 bs=1k seek=443
  1291.  
  1292.   (The value 443 is ROOTBEGIN from the section "Calculating the space"
  1293.   above.)
  1294.  
  1295.   Wait for the floppy drive to finish writing, and you're done.
  1296.  
  1297.   4.5.  Making a two-disk set
  1298.  
  1299.   If you want more space, you can make a two-disk boot set.  In this
  1300.   case, the first floppy disk will contain the kernel alone, and the
  1301.   second will contain the compressed root filesystem.  With this
  1302.   configuration you can use a compressed filesystem of up to 1440K.
  1303.  
  1304.   A two-disk set is created using a simple variation of the instructions
  1305.   above.  First, you must set the ramdisk PROMPT flag to 1 to instruct
  1306.   the kernel to prompt and wait for the second floppy.  The root
  1307.   filesystem will begin at byte 0 of the second floppy.
  1308.  
  1309.   >From the section "Calculating the space" above, the ramdisk PROMPT
  1310.   flag (bit 15) will be set to 1, and the ramdisk offset will be zero.
  1311.   In our example the new calculation would be:
  1312.  
  1313.                        4000 (hex)      Ramdisk load flag (bit 14)
  1314.                      + 8000 (hex)      Ramdisk prompt flag (bit 15)
  1315.                      ------------
  1316.                      = C000 (hex)
  1317.                      =49152 (decimal)
  1318.  
  1319.   which would be used in the 'rdev -r' calculation as before.
  1320.  
  1321.   Follow the instructions of "Copying files to the floppy" above, but
  1322.   after issuing the 'rdev -r' command, put a new floppy in the drive and
  1323.   issue the command:
  1324.  
  1325.                dd if=rootfs.gz of=/dev/fd0
  1326.  
  1327.   The seek option is not needed since the root filesystem starts at
  1328.   block zero.
  1329.  
  1330.   5.  Troubleshooting
  1331.  
  1332.   When building rescue disks, it is not uncommon that the first few
  1333.   tries will not boot.  The general approach to building a root disk is
  1334.   to assemble components from your existing system, and try and get the
  1335.   diskette-based system to the point where it displays messages on the
  1336.   console. Once it starts talking to you, the battle is half over,
  1337.   because you can see what it is complaining about, and you can fix
  1338.   individual problems until the system works smoothly. If the system
  1339.   just hangs with no explanation, finding the cause can be difficult.
  1340.   To get a system to boot to the stage where it will talk to you
  1341.   requires several components to be present and correctly configured.
  1342.   The recommended procedure for investigating the problem where the
  1343.   system will not talk to you is as follows:
  1344.  
  1345.   ╖  Check that the root disk actually contains the directories you
  1346.      think it does. It is easy to copy at the wrong level so that you
  1347.      end up with something like /root_disk/bin instead of /bin on your
  1348.      root diskette.
  1349.  
  1350.   ╖  Check that there is a /lib/libc.so and /lib/libtermcap.so, with the
  1351.      same links as appear in your lib directory on your hard disk.
  1352.  
  1353.   ╖  check that any symbolic links in your /dev directory in your
  1354.      existing  system also exist on your root diskette filesystem, where
  1355.      those links are to devices which you have included in your root
  1356.      diskette. In particular, /dev/console links are essential in many
  1357.      cases.
  1358.  
  1359.   ╖  Check that you have included /dev/tty1 on your root disk.
  1360.  
  1361.   ╖  Check that you have included /dev/null, /dev/zero, /dev/mem,
  1362.      /dev/ram  and /dev/kmem devices.
  1363.  
  1364.   ╖  Check your kernel configuration - support for all resources
  1365.      required up to login point must be built in, not modules. Also,
  1366.      ramdisk support must be included.
  1367.  
  1368.   ╖  Check that your kernel root device and ramdisk settings are
  1369.      correct. Refer to Section ``Advanced Bootdisk Creation'' for
  1370.      details.
  1371.  
  1372.   Once these general aspects have been covered, here are some more
  1373.   specific files to check:
  1374.  
  1375.   1. Make sure init is included as /sbin/init or /bin/init. Make sure
  1376.      it's executable.
  1377.  
  1378.   2. Run ldd init to check init's libraries.  Usually this is just
  1379.      libc.so, but check anyway.  Make sure you included the libraries.
  1380.  
  1381.   3. Run file on the library(ies) reported by ldd to see what type they
  1382.      are.  Make sure you have the right loader file on the root disk.
  1383.      The loader file is either ld.so (for a.out libraries) or ld-
  1384.      linux.so (for ELF libraries).
  1385.  
  1386.   4. Check the /etc/inittab  on your bootdisk filesystem for the calls
  1387.      to *getty* (-- The notation *getty* will be used to mean some
  1388.      getty-like program, eg getty, agetty, mgetty or getty_ps.--) .
  1389.      Double-check these against your hard disk inittab.  Check the man
  1390.      pages of the program you use to make sure these make sense.
  1391.      Inittab is possibly the trickiest part because its syntax and
  1392.      content depend on the init program used and the nature of the
  1393.      system. The only way to tackle it is to read the man pages for init
  1394.      and inittab and work out exactly what your existing system is doing
  1395.      when it boots.  Check to make sure /etc/inittab has a system
  1396.      initialisation entry. This should contain a command of the form
  1397.      /etc/rc.x, to execute one of the /etc/rc scripts. The specific
  1398.      script in the inittab must exist.
  1399.  
  1400.   5. As with init, run ldd on getty (or agetty) to see what it needs,
  1401.      and make sure the necessary library files and loaders were included
  1402.      in your root filesystem.
  1403.  
  1404.   6. If you have a /etc/ld.so.cache file on your rescue disk, remake it.
  1405.  
  1406.   If init starts, but you get a message like:
  1407.  
  1408.        Id xxx respawning too fast: disabled for n minutes
  1409.  
  1410.   it's coming from init, usually indicating that your *getty* or login
  1411.   is dying as soon as it starts up.  Check the *getty* and login
  1412.   executables, and the libraries they depend upon.  Make sure the
  1413.   invocations in /etc/inittab are correct.  If you get strange messages
  1414.   from *getty*, it may mean the calling form in /etc/inittab is wrong.
  1415.   The options of the *getty* programs are variable; even different
  1416.   versions of agetty are reported to have different incompatible calling
  1417.   forms.  If you're using a different call and/or program from what you
  1418.   use in your hard disk /etc/inittab, double check it.
  1419.  
  1420.   If you try to run some executable, such as df, which is on your rescue
  1421.   disk but you yields a message like: df: not found, check two things:
  1422.  
  1423.   1. Make sure the directory containing the binary is in your PATH.
  1424.  
  1425.   2. Make sure you have libraries (and loaders) the program needs.  Type
  1426.      ldd file to see what libraries are needed, and make sure those
  1427.      libraries exist.  See the section above on /lib
  1428.  
  1429.   6.  Frequently Asked Question (FAQ) List
  1430.  
  1431.   6.1.  Q. I boot from my boot/root disks and nothing happens. What do I
  1432.   do?
  1433.  
  1434.   This answer has been moved to Section ``Troubleshooting'', above.
  1435.  
  1436.   6.2.  Q. How can I make a boot disk with a XXX driver?
  1437.  
  1438.   The easiest way is to obtain a Slackware kernel from your nearest
  1439.   Slackware mirror site. Slackware kernels are generic kernels which
  1440.   atttempt to include drivers for as many devices as possible, so if you
  1441.   have a SCSI or IDE controller, chances are that a driver for it is
  1442.   included in the Slackware kernel.
  1443.  
  1444.   Go to the a1 directory and select either IDE or SCSI kernel depending
  1445.   on the type of controller you have. Check the xxxxkern.cfg file for
  1446.   the selected kernel to see the drivers which have been included in
  1447.   that kernel. If the device you want is in that list, then the
  1448.   corresponding kernel should boot your computer. Download the
  1449.   xxxxkern.tgz file and copy it to your boot diskette as described above
  1450.   in the section on making boot disks.
  1451.  
  1452.   You must then check the root device in the kernel, using the rdev
  1453.   command:
  1454.  
  1455.           rdev zImage
  1456.  
  1457.   Rdev will then display the current root device in the kernel. If this
  1458.   is not the same as the root device you want, then use rdev to change
  1459.   it.  For example, the kernel I tried was set to /dev/sda2, but my root
  1460.   scsi partition is /dev/sda8. To use a root diskette, you would have to
  1461.   use the command:
  1462.  
  1463.                rdev zImage /dev/fd0
  1464.  
  1465.   If you want to know how to set up a Slackware root disk as well,
  1466.   that's outside the scope of this HOWTO, so I suggest you check the
  1467.   Linux Install Guide or get the Slackware distribution. See the section
  1468.   in this HOWTO titled "References".
  1469.  
  1470.   6.3.  Q. How do I update my boot floppy with a new kernel?
  1471.  
  1472.   Just copy the kernel to your boot diskette using the dd command for a
  1473.   boot diskette without a filesystem, or the cp command for a boot/root
  1474.   disk. Refer to the section in this HOWTO titled "Boot" for details on
  1475.   creating a boot disk. The description applies equally to updating a
  1476.   kernel on a boot disk.
  1477.  
  1478.   6.4.  Q. How do I remove LILO so that I can use DOS to boot again?
  1479.  
  1480.   This is not really a Bootdisk topic, but it is asked so often, so: the
  1481.   answer is, use the DOS command:
  1482.  
  1483.                FDISK /MBR
  1484.  
  1485.   MBR stands for Master Boot Record, and it replaces the boot sector
  1486.   with a clean DOS one, without affecting the partition table. Some
  1487.   purists disagree with this, but even the author of LILO, Werner
  1488.   Almesberger, suggests it. It is easy, and it works.
  1489.  
  1490.   You can also use the dd command to copy the backup saved by LILO to
  1491.   the boot sector - refer to the LILO documentation if you wish to do
  1492.   this.
  1493.  
  1494.   6.5.  Q. How can I boot if I've lost my kernel AND my boot disk?
  1495.  
  1496.   If you don't have a boot disk standing by, then probably the easiest
  1497.   method is to obtain a Slackware kernel for your disk controller type
  1498.   (IDE or SCSI) as described above for "How do I make a boot disk with a
  1499.   XXX driver?". You can then boot your computer using this kernel, then
  1500.   repair whatever damage there is.
  1501.  
  1502.   The kernel you get may not have the root device set to the disk type
  1503.   and partition you want. For example, Slackware's generic scsi kernel
  1504.   has the root device set to /dev/sda2, whereas my root Linux partition
  1505.   happens to be /dev/sda8. In this case the root device in the kernel
  1506.   will have to be changed.
  1507.   You can still change the root device and ramdisk settings in the
  1508.   kernel even if all you have is a kernel, and some other operating
  1509.   system, such as DOS.
  1510.  
  1511.   Rdev changes kernel settings by changing the values at fixed offsets
  1512.   in the kernel file, so you can do the same if you have a hex editor
  1513.   available on whatever systems you do still have running - for example,
  1514.   Norton Utilities Disk Editor under DOS.  You then need to check and if
  1515.   necessary change the values in the kernel at the following offsets:
  1516.  
  1517.        0x01F8  Low byte of RAMDISK size
  1518.        0x01F9  High byte of RAMDISK size
  1519.        0x01FC  Root minor device number - see below
  1520.        0X01FD  Root major device number - see below
  1521.  
  1522.   The ramdisk size is the number of blocks of ramdisk to create.  If you
  1523.   want to boot from a root diskette then set this to decimal 1440, which
  1524.   is 0x05A0, thus set offset 0x01F8 to 0xA0 and offset 0x01F9 to 0x05.
  1525.   This will allocate enough space for a 1.4Mb diskette.
  1526.  
  1527.   Note that the meaning of the ramdisk size word changed in kernel
  1528.   version 1.3.48.  This meaning is described in Section ``Advanced
  1529.   Bootdisk Creation''.
  1530.  
  1531.   The major and minor device numbers must be set to the device you want
  1532.   to mount your root filesystem on. Some useful values to select from
  1533.   are:
  1534.  
  1535.        device          major minor
  1536.        /dev/fd0            2     0   1st floppy drive
  1537.        /dev/hda1           3     1   partition 1 on 1st IDE drive
  1538.        /dev/sda1           8     1   partition 1 on 1st scsi drive
  1539.        /dev/sda8           8     8   partition 8 on 1st scsi drive
  1540.  
  1541.   Once you have set these values then you can write the file to a
  1542.   diskette using either Norton Utilities Disk Editor, or a program
  1543.   called rawrite.exe. This program is included in several distributions,
  1544.   including the SLS and Slackware distributions.  It is a DOS program
  1545.   which writes a file to the "raw" disk, starting at the boot sector,
  1546.   instead of writing it to the file system. If you use Norton Utilities,
  1547.   then you must write the file to a physical disk starting at the
  1548.   beginning of the disk.
  1549.  
  1550.   6.6.  Q. How can I make extra copies of boot/root diskettes?
  1551.  
  1552.   It is never desirable to have just one set of rescue disks - 2 or 3
  1553.   should be kept in case one is unreadable.
  1554.  
  1555.   The easiest way of making copies of any diskettes, including bootable
  1556.   and utility diskettes, is to use the dd command to copy the contents
  1557.   of the original diskette to a file on your hard drive, and then use
  1558.   the same command to copy the file back to a new diskette.  Note that
  1559.   you do not need to, and should not, mount the diskettes, because dd
  1560.   uses the raw device interface.
  1561.  
  1562.   To copy the original, enter the command:
  1563.  
  1564.           dd if=devicename of=filename
  1565.           where   devicename the device name of the diskette
  1566.                   drive
  1567.           and     filename the name of the file where you
  1568.                   want to copy to
  1569.  
  1570.   For example, to copy from /dev/fd0 to a temporary file called
  1571.   /tmp/diskette.copy, I would enter the command:
  1572.  
  1573.                dd if=/dev/fd0 of=/tmp/diskette.copy
  1574.  
  1575.   Omitting the "count" parameter, as we have done here, means that the
  1576.   whole diskette of 2880 (for a high-density) blocks will be copied.
  1577.  
  1578.   To copy the resulting file back to a new diskette, insert the new
  1579.   diskette and enter the reverse command:
  1580.  
  1581.                dd if=filename of=devicename
  1582.  
  1583.   Note that the above discussion assumes that you have only one diskette
  1584.   drive. If you have two of the same type, then you can copy diskettes
  1585.   using a command like:
  1586.  
  1587.                dd if=/dev/fd0 of=/dev/fd1
  1588.  
  1589.   6.7.  Q. How can I boot without typing in "ahaxxxx=nn,nn,nn" every
  1590.   time?
  1591.  
  1592.   Where a disk device cannot be autodetected it is necessary to supply
  1593.   the kernel with a command device parameter string, such as:
  1594.  
  1595.                aha152x=0x340,11,3,1
  1596.  
  1597.   This parameter string can be supplied in several ways using LILO:
  1598.  
  1599.   ╖  By entering it on the command line every time the system is booted
  1600.      via LILO. This is boring, though.
  1601.  
  1602.   ╖  By using the LILO "lock" keyword to make it store the command line
  1603.      as the default command line, so that LILO will use the same options
  1604.      every time it boots.
  1605.  
  1606.   ╖  By using the APPEND statement in the lilo config file. Note that
  1607.      the parameter string must be enclosed in quotes.
  1608.  
  1609.   For example, a sample command line using the above parameter string
  1610.   would be:
  1611.  
  1612.                zImage  aha152x=0x340,11,3,1 root=/dev/sda1 lock
  1613.  
  1614.   This would pass the device parameter string through, and also ask the
  1615.   kernel to set the root device to /dev/sda1 and save the whole command
  1616.   line and reuse it for all future boots.
  1617.  
  1618.   A sample APPEND statement is:
  1619.  
  1620.                APPEND = "aha152x=0x340,11,3,1"
  1621.  
  1622.   Note that the parameter string must NOT be enclosed in quotes on the
  1623.   command line, but it MUST be enclosed in quotes in the APPEND
  1624.   statement.
  1625.  
  1626.   Note also that for the parameter string to be acted on, the kernel
  1627.   must contain the driver for that disk type. If it does not, then there
  1628.   is nothing listening for the parameter string, and you will have to
  1629.   rebuild the kernel to include the required driver. For details on
  1630.   rebuilding the kernel, cd to /usr/src/linux and read the README, and
  1631.   read the Linux FAQ and Installation HOWTO. Alternatively you could
  1632.   obtain a generic kernel for the disk type and install that.
  1633.  
  1634.   Readers are strongly urged to read the LILO documentation before
  1635.   experimenting with LILO installation. Incautious use of the "BOOT"
  1636.   statement can damage partitions.
  1637.  
  1638.   6.8.  Q. How can I create an oversize ramdisk filesystem?
  1639.  
  1640.   For kernels 1.3.48+, it is best to create a compressed filesystem as
  1641.   described in Section ``Advanced Bootdisk Creation''. If your kernel is
  1642.   earlier than this, you can either upgrade, or refer to version 2.0 or
  1643.   below of this HOWTO.
  1644.  
  1645.   6.9.  Q. At boot time, I get error A: cannot execute B. Why?
  1646.  
  1647.   There are several cases of program names being hardcoded in various
  1648.   utilities. These cases do not occur everywhere, but they may explain
  1649.   why an executable apparently cannot be found on your system even
  1650.   though you can see that it is there. You can find out if a given
  1651.   program has the name of another hardcoded by using the "strings"
  1652.   command and piping the output through grep.
  1653.  
  1654.   Known examples of hardcoding are:
  1655.  
  1656.   ╖  Shutdown in some versions has /etc/reboot hardcoded, so reboot must
  1657.      be placed in the /etc directory.
  1658.  
  1659.   ╖  Init has caused problems for at least one person, with the kernel
  1660.      being unable to find init.
  1661.  
  1662.   To fix these problems, either move the programs to the correct
  1663.   directory, or change configuration files (e.g. inittab) to point to
  1664.   the correct directory. If in doubt, put programs in the same
  1665.   directories as they are on your hard disk, and use the same inittab
  1666.   and /etc/rc.d files as they appear on your hard disk.
  1667.  
  1668.   6.10.  Q. My kernel has ramdisk support, but initializes ramdisks of
  1669.   0K
  1670.  
  1671.   Where this occurs, a kernel message similar to:
  1672.  
  1673.        Ramdisk driver initialized : 16 ramdisks of 0K size
  1674.  
  1675.   appears as the kernel is booting. The size should be either the
  1676.   default of 4096K, or the size specified in kernel parameters
  1677.   ramdisk_size or ramdisk.  If the size is 0K, it is probably because
  1678.   the size has been set to 0 by kernel parameters at boot time. This
  1679.   could possibly be because of an overlooked LILO configuration file
  1680.   parameter:
  1681.  
  1682.        ramdisk 0
  1683.  
  1684.   This was included in sample LILO configuration files included in some
  1685.   older distributions, and was put there to override any previous kernel
  1686.   setting.  Since 1.3.48 it is irrelevant, because the ramdisk_size
  1687.   kernel parameter now sets the maximum ramdisk size, not the size
  1688.   allocated at boot time.  No ramdisk memory is allocated at boot time.
  1689.  
  1690.   The solution is to remove the LILO ramdisk parameter.
  1691.  
  1692.   Note that if you attempt to use a ramdisk which has been set to 0K,
  1693.   then behaviour can be unpredictable, and can result in kernel panics.
  1694.  
  1695.   G.  Resources and Pointers
  1696.  
  1697.   In this section, vvv is used in package names in place of the version,
  1698.   to avoid referring here to specific versions. When retrieving a
  1699.   package, always get the latest version unless you have good reasons
  1700.   for not doing so.
  1701.  
  1702.   G.1.  Distribution bootdisks
  1703.  
  1704.   These are the primary sources for distribution bootdisks.
  1705.  
  1706.   Please use one of the mirror sites to reduce the load on these
  1707.   machines.
  1708.  
  1709.   ╖  Slackware bootdisks
  1710.      <http://sunsite.unc.edu/pub/Linux/distributions/slackware/bootdsks.144/>
  1711.      and Slackware mirror sites
  1712.      <http://sunsite.unc.edu/pub/Linux/distributions/slackware/MIRRORS.TXT>
  1713.  
  1714.   ╖  Red Hat bootdisks
  1715.      <http://sunsite.unc.edu/pub/Linux/distributions/redhat/current/i386/images/>
  1716.      and Red Hat mirror sites <http://www.redhat.com/ftp.html>
  1717.  
  1718.   ╖  Debian bootdisks <ftp://ftp.debian.org/pub/debian/stable/disks-
  1719.      i386> and Debian mirror sites
  1720.      <ftp://ftp.debian.org/debian/README.mirrors>
  1721.  
  1722.   G.2.  LILO - Linux Loader
  1723.  
  1724.   Written by Werner Almesberger. Excellent boot loader, and the
  1725.   documentation includes information on the boot sector contents and the
  1726.   early stages of the boot process.
  1727.  
  1728.   Ftp from: tsx-11.mit.edu: /pub/linux/packages/lilo/lilo.vvv.tar.gz
  1729.   also on sunsite and mirror sites.
  1730.  
  1731.   G.3.  Linux FAQ and HOWTOs
  1732.  
  1733.   These are available from many sources. Look at the usenet newsgroups
  1734.   news.answers and comp.os.linux.announce.
  1735.  
  1736.   Ftp from: sunsite.unc.edu:/pub/Linux/docs
  1737.  
  1738.   ╖  FAQ is in /pub/linux/docs/faqs/linux-faq
  1739.  
  1740.   ╖  HOWTOs are in /pub/Linux/docs/HOWTO
  1741.  
  1742.   For WWW, start at the Linux documentation home page:
  1743.  
  1744.        http://sunsite.unc.edu/mdw/linux.html
  1745.  
  1746.   If desperate, send mail to:
  1747.  
  1748.                mail-server@rtfm.mit.edu
  1749.  
  1750.   with the word "help" in the message, then follow the mailed
  1751.   instructions.
  1752.  
  1753.   Note: if you haven't read the Linux FAQ and related documents such as
  1754.   the Linux Installation HOWTO and the Linux Install Guide, then you
  1755.   should not be trying to build boot diskettes.
  1756.  
  1757.   G.4.  Ramdisk Usage
  1758.  
  1759.   An excellent description of the how the new ramdisk code works may be
  1760.   found with the documentation supplied with the Linux kernel.  See
  1761.   /usr/src/linux/Documentation/ramdisk.txt.  It is written by Paul
  1762.   Gortmaker and includes a section on creating a compressed ramdisk,
  1763.   similar to Section ``Advanced Bootdisk Creation'' of this HOWTO.
  1764.  
  1765.   G.5.  Rescue Packages
  1766.  
  1767.   G.5.1.  Bootkit
  1768.  
  1769.   Written by Scott Burkett. Bootkit provides a flexible menu-driven
  1770.   framework for managing rescue disk creation and contents. It uses the
  1771.   Dialog package to provide nice menus, and a straight-forward directory
  1772.   tree to contain definitions of rescue disk contents. The package
  1773.   includes samples of the main files needed. The package aims to provide
  1774.   only the framework; it is up to the user to work out what to put on
  1775.   the disks and set up the config files accordingly.  For those users
  1776.   who don't mind doing this, it is a good choice.
  1777.  
  1778.   Ftp from: sunsite.unc.edu: /pub/Linux/system/Recovery/Bootkit-
  1779.   vvv.tar.gz
  1780.  
  1781.   G.5.2.  CatRescue
  1782.  
  1783.   Written by Oleg Kibirev. This package concentrates on saving space on
  1784.   the rescue diskettes by extensive use of compression, and by
  1785.   implementing executables as shells scripts. The doco includes some
  1786.   tips on what to do in various disaster situations.
  1787.  
  1788.   Ftp from: gd.cs.csufresno.edu/pub/sun4bin/src/CatRescue100.tgz
  1789.  
  1790.   G.5.3.  Rescue Shell Scripts
  1791.  
  1792.   Written by Thomas Heiling. This contains shell scripts to produce boot
  1793.   and boot/root diskettes. It has some dependencies on specific versions
  1794.   of other software such as LILO, and so might need some effort to
  1795.   convert to your system, but it might be useful as a starting point if
  1796.   you wanted more comprehensive shell scripts than are provided in this
  1797.   document.
  1798.  
  1799.   Ftp from: sunsite.unc.edu:/pub/Linux/system/Recovery/rescue.tgz
  1800.  
  1801.   G.5.4.  SAR - Search and Rescue
  1802.  
  1803.   Written by Karel Kubat. SAR produces a rescue diskette, using several
  1804.   techniques to minimize the space required on the diskette.  The manual
  1805.   includes a description of the Linux boot/login process.
  1806.  
  1807.   Ftp from: ftp.icce.rug.nl:/pub/unix/SAR-vvv.tar.gz
  1808.  
  1809.   The manual is available via WWW from:
  1810.  
  1811.   http://www.icce.rug.nl/karel/programs/SAR.html
  1812.  
  1813.   G.5.5.  YARD
  1814.  
  1815.   Written by Tom Fawcett.  Yard produces customized rescue diskettes
  1816.   using the compressed ramdisk option of more recent kernels (1.3.48+).
  1817.   Yard was designed to automate most of the instructions in Section
  1818.   ``Advanced Bootdisk Creation'', above.  In addition, Yard checks your
  1819.   file selections (loaders and libraries, and /etc/fstab, rc,
  1820.   /etc/passwd) to make sure you've included everything needed to make a
  1821.   bootable rescue disk.  Yard needs Perl 5 and kernel version 1.3.48 or
  1822.   later.
  1823.  
  1824.   The Yard homepage is at  <http://www.cs.umass.edu/~fawcett/yard.html>,
  1825.   which should always have the latest version, plus notices of any
  1826.   recent bugs.  Yard may also be downloaded from
  1827.   <http://sunsite.unc.edu/pub/Linux/system/Recovery/>
  1828.  
  1829.   H.  Samples
  1830.  
  1831.   H.1.  Disk Directory Listings
  1832.  
  1833.   This lists the contents of directories from my root and utility
  1834.   diskettes. These lists are provided as an example only of the files
  1835.   included to create a working system. I have added some explanatory
  1836.   notes where it seemed useful.
  1837.  
  1838.   H.1.1.  Root Disk ls-lR Directory Listing
  1839.  
  1840.   total 18
  1841.   drwxr-xr-x   2 root     root         1024 Jul 29 21:16 bin/
  1842.   drwxr-xr-x   2 root     root         9216 Jul 28 16:21 dev/
  1843.   drwxr-xr-x   3 root     root         1024 Jul 29 20:25 etc/
  1844.   drwxr-xr-x   2 root     root         1024 Jul 28 19:53 lib/
  1845.   drwxr-xr-x   2 root     root         1024 Jul 24 22:47 mnt/
  1846.   drwxr-xr-x   2 root     root         1024 Jul 24 22:47 proc/
  1847.   drwxr-xr-x   2 root     root         1024 Jul 28 19:07 sbin/
  1848.   drwxr-xr-x   2 root     root         1024 Jul 29 20:57 tmp/
  1849.   drwxr-xr-x   4 root     root         1024 Jul 29 21:35 usr/
  1850.   drwxr-xr-x   3 root     root         1024 Jul 28 19:52 var/
  1851.  
  1852.   bin:
  1853.   total 713
  1854.   -rwxr-xr-x   1 root     bin          7737 Jul 24 22:16 cat*
  1855.   -rwxr-xr-x   1 root     bin          9232 Jul 24 22:48 chmod*
  1856.   -rwxr-xr-x   1 root     bin          8156 Jul 24 22:48 chown*
  1857.   -rwxr-xr-x   1 root     bin         19652 Jul 24 22:48 cp*
  1858.   -rwxr-xr-x   1 root     root         8313 Jul 29 21:16 cut*
  1859.   -rwxr-xr-x   1 root     bin         12136 Jul 24 22:48 dd*
  1860.   -rwxr-xr-x   1 root     bin          9308 Jul 24 22:48 df*
  1861.   -rwxr-xr-x   1 root     root         9036 Jul 29 20:24 dircolors*
  1862.   -rwxr-xr-x   1 root     bin          9064 Jul 24 22:48 du*
  1863.   -rwxr-x---   1 root     bin         69252 Jul 24 22:51 e2fsck*
  1864.   -rwxr-xr-x   1 root     bin          5361 Jul 24 22:48 echo*
  1865.   -rwxr-xr-x   1 root     bin          5696 Jul 24 22:16 hostname*
  1866.   -rwxr-xr-x   1 root     bin          6596 Jul 24 22:49 kill*
  1867.   -rwxr-xr-x   1 root     bin         10644 Jul 24 22:17 ln*
  1868.   -rwxr-xr-x   1 root     bin         13508 Jul 24 22:17 login*
  1869.   -rwxr-xr-x   1 root     bin         26976 Jul 24 22:17 ls*
  1870.   -rwxr-xr-x   1 root     bin          7416 Jul 24 22:49 mkdir*
  1871.   -rwxr-x---   1 root     bin         34596 Jul 24 22:51 mke2fs*
  1872.   -rwxr-xr-x   1 root     bin          6712 Jul 24 22:49 mknod*
  1873.   -rwxr-xr-x   1 root     bin         20304 Jul 24 22:17 more*
  1874.   -rwxr-xr-x   1 root     bin         24704 Jul 24 22:17 mount*
  1875.   -rwxr-xr-x   1 root     bin         12464 Jul 24 22:17 mv*
  1876.   -rwxr-xr-x   1 root     bin         20829 Jul 24 22:50 ps*
  1877.   -rwxr-xr-x   1 root     bin          9424 Jul 24 22:50 rm*
  1878.   -rwxr-xr-x   1 root     bin          4344 Jul 24 22:50 rmdir*
  1879.   -rwxr-xr-x   1 root     root       299649 Jul 27 14:12 sh*
  1880.   -rwxr-xr-x   1 root     bin          9853 Jul 24 22:17 su*
  1881.   -rwxr-xr-x   1 root     bin           380 Jul 27 14:12 sync*
  1882.   -rwxr-xr-x   1 root     bin         13620 Jul 24 22:17 umount*
  1883.   -rwxr-xr-x   1 root     root         5013 Jul 29 20:03 uname*
  1884.  
  1885.   dev:
  1886.   total 0
  1887.   lrwxrwxrwx   1 root     root           10 Jul 24 22:34 cdrom -> /dev/sbpcd
  1888.   crw--w--w-   1 root     tty        4,   0 Jul 24 21:49 console
  1889.   brw-rw----   1 root     floppy     2,   0 Apr 28  1995 fd0
  1890.   lrwxrwxrwx   1 root     root            4 Jul 24 22:34 ftape -> rft0
  1891.   crw-rw-rw-   1 root     sys       10,   2 Jul 18  1994 inportbm
  1892.   crw-rw----   1 root     kmem       1,   2 Jul 28 16:21 kmem
  1893.   crw-rw----   1 root     kmem       1,   1 Jul 18  1994 mem
  1894.   lrwxrwxrwx   1 root     root            4 Jul 24 22:34 modem -> cua0
  1895.   lrwxrwxrwx   1 root     root            4 Jul 24 22:34 mouse -> cua1
  1896.   crw-rw-rw-   1 root     sys        1,   3 Jul 18  1994 null
  1897.   brw-rw----   1 root     disk       1,   1 Jul 18  1994 ram
  1898.   crw-rw----   1 root     disk      27,   0 Jul 18  1994 rft0
  1899.   brw-rw----   1 root     disk      25,   0 Jul 19  1994 sbpcd
  1900.   ***  I have only included devices for the SCSI partitions I use.
  1901.   ***  If you use IDE, then use /dev/hdxx instead.
  1902.   brw-rw----   1 root     disk       8,   0 Apr 29  1995 sda
  1903.   brw-rw----   1 root     disk       8,   6 Apr 29  1995 sda6
  1904.   brw-rw----   1 root     disk       8,   7 Apr 29  1995 sda7
  1905.   brw-rw----   1 root     disk       8,   8 Apr 29  1995 sda8
  1906.   lrwxrwxrwx   1 root     root            7 Jul 28 12:56 systty -> console
  1907.   ***  this link from systty to console is required
  1908.   crw-rw-rw-   1 root     tty        5,   0 Jul 18  1994 tty
  1909.   crw--w--w-   1 root     tty        4,   0 Jul 18  1994 tty0
  1910.   crw--w----   1 root     tty        4,   1 Jul 24 22:33 tty1
  1911.   crw--w----   1 root     tty        4,   2 Jul 24 22:34 tty2
  1912.   crw--w--w-   1 root     root       4,   3 Jul 24 21:49 tty3
  1913.   crw--w--w-   1 root     root       4,   4 Jul 24 21:49 tty4
  1914.   crw--w--w-   1 root     root       4,   5 Jul 24 21:49 tty5
  1915.   crw--w--w-   1 root     root       4,   6 Jul 24 21:49 tty6
  1916.   crw-rw-rw-   1 root     tty        4,   7 Jul 18  1994 tty7
  1917.   crw-rw-rw-   1 root     tty        4,   8 Jul 18  1994 tty8
  1918.   crw-rw-rw-   1 root     tty        4,   9 Jul 19  1994 tty9
  1919.   crw-rw-rw-   1 root     sys        1,   5 Jul 18  1994 zero
  1920.  
  1921.   etc:
  1922.   total 20
  1923.   -rw-r--r--   1 root     root         2167 Jul 29 20:25 DIR_COLORS
  1924.   -rw-r--r--   1 root     root           20 Jul 28 12:37 HOSTNAME
  1925.   -rw-r--r--   1 root     root          109 Jul 24 22:57 fstab
  1926.   -rw-r--r--   1 root     root          271 Jul 24 22:21 group
  1927.   -rw-r--r--   1 root     root         2353 Jul 24 22:27 inittab
  1928.   -rw-r--r--   1 root     root            0 Jul 29 21:02 issue
  1929.   -rw-r--r--   1 root     root         2881 Jul 28 19:38 ld.so.cache
  1930.   ***  Lots of things get upset at boot time if ld.so.cache is missing, but
  1931.   ***  make sure that ldconfig is included and run from rc.x to
  1932.   ***  update it.
  1933.   -rw-r--r--   1 root     root           12 Jul 24 22:22 motd
  1934.   -rw-r--r--   1 root     root          606 Jul 28 19:25 passwd
  1935.   -rw-r--r--   1 root     root         1065 Jul 24 22:21 profile
  1936.   drwxr-xr-x   2 root     root         1024 Jul 29 21:01 rc.d/
  1937.   -rw-r--r--   1 root     root           18 Jul 24 22:21 shells
  1938.   -rw-r--r--   1 root     root          774 Jul 28 13:43 termcap
  1939.   -rw-r--r--   1 root     root          126 Jul 28 13:44 ttys
  1940.   -rw-r--r--   1 root     root            0 Jul 24 22:47 utmp
  1941.  
  1942.   etc/rc.d:
  1943.   total 5
  1944.   *** I didn't bother with shutdown scripts - everthing runs on a
  1945.   *** ramdisk, so there's not much point shutting it down.
  1946.   -rwxr-xr-x   1 root     root         1158 Jul 24 22:23 rc.K*
  1947.   -rwxr-xr-x   1 root     root         1151 Jul 28 19:08 rc.M*
  1948.   -rwxr-xr-x   1 root     root          507 Jul 29 20:25 rc.S*
  1949.  
  1950.   lib:
  1951.   total 588
  1952.   *** I have an ELF system, so I include the ELF loader ld-linux.so. if
  1953.   *** you are still on a.out, then you need ld.so. Use the file command to
  1954.   *** see which libraries you should include.
  1955.   lrwxrwxrwx   1 root     root           17 Jul 24 23:36 ld-linux.so.1 -> ld-linux.so.1.7.3*
  1956.   -rwxr-xr-x   1 root     root        20722 Aug 15  1995 ld-linux.so.1.7.3*
  1957.   lrwxrwxrwx   1 root     root           13 Jul 24 23:36 libc.so.5 -> libc.so.5.0.9*
  1958.   -rwxr-xr-x   1 root     root       562683 May 19  1995 libc.so.5.0.9*
  1959.   ***  Must include libtermcap
  1960.   lrwxrwxrwx   1 root     root           19 Jul 28 19:53 libtermcap.so.2 -> libtermcap.so.2.0.0*
  1961.   -rwxr-xr-x   1 root     root        11360 May 19  1995 libtermcap.so.2.0.0*
  1962.  
  1963.   mnt:
  1964.   total 0
  1965.  
  1966.   proc:
  1967.   total 0
  1968.  
  1969.   sbin:
  1970.   total 191
  1971.   ***  I use Slackware, which uses agetty. Many systems use getty.
  1972.   ***  Check your /etc/inittab to see which it uses. Note that you
  1973.   ***  need (a)getty and login to be able to start doing much.
  1974.   -rwxr-xr-x   1 root     bin         11309 Jul 24 22:54 agetty*
  1975.   -rwxr-xr-x   1 root     bin          5204 Jul 24 22:19 halt*
  1976.   ***  Must have this to boot
  1977.   -rwxr-xr-x   1 root     bin         20592 Jul 24 22:19 init*
  1978.   -rwxr-xr-x   1 root     root        86020 Jul 28 19:07 ldconfig*
  1979.   -rwxr-xr-x   1 root     bin          5329 Jul 27 14:10 mkswap*
  1980.   -rwxr-xr-x   1 root     root         5204 Jul 24 22:20 reboot*
  1981.   -rwxr-xr-x   1 root     bin         12340 Jul 24 22:20 shutdown*
  1982.   -rwxr-xr-x   1 root     root         5029 Jul 24 22:20 swapoff*
  1983.   -rwxr-xr-x   1 root     bin          5029 Jul 24 22:20 swapon*
  1984.   -rwxr-xr-x   1 root     root        20592 Jul 27 18:18 telinit*
  1985.   -rwxr-xr-x   1 root     root         7077 Jul 24 22:20 update*
  1986.  
  1987.   tmp:
  1988.   total 0
  1989.  
  1990.   usr:
  1991.   total 2
  1992.   drwxr-xr-x   2 root     root         1024 Jul 29 21:00 adm/
  1993.   drwxr-xr-x   2 root     root         1024 Jul 29 21:16 lib/
  1994.  
  1995.   usr/adm:
  1996.   total 0
  1997.  
  1998.   usr/lib:
  1999.   total 0
  2000.  
  2001.   var:
  2002.   total 1
  2003.   ***  Several things complained until I included this and
  2004.   ***  the /etc/rc.S code to initialise /var/run/utmp, but this
  2005.   ***  won't necessarily apply to your system.
  2006.   drwxr-xr-x   2 root     root         1024 Jul 28 19:52 run/
  2007.  
  2008.   var/run:
  2009.   total 0
  2010.  
  2011.   H.1.2.  Utility Disk ls-lR Directory Listing
  2012.  
  2013.        total 579
  2014.        -rwxr-xr-x   1 root     root        42333 Jul 28 19:05 cpio*
  2015.        -rwxr-xr-x   1 root     root       103560 Jul 29 21:31 elvis*
  2016.        -rwxr-xr-x   1 root     root        56401 Jul 28 19:06 find*
  2017.        -rw-r--r--   1 root     root       128254 Jul 28 19:03 ftape.o
  2018.        -rwxr-xr-x   1 root     root        64161 Jul 29 20:47 grep*
  2019.        -rwxr-xr-x   1 root     root        45309 Jul 29 20:48 gzip*
  2020.        -rwxr-xr-x   1 root     root        23560 Jul 28 19:04 insmod*
  2021.        -rwxr-xr-x   1 root     root          118 Jul 28 19:04 lsmod*
  2022.        lrwxrwxrwx   1 root     root            5 Jul 28 19:04 mt -> mt-st*
  2023.        -rwxr-xr-x   1 root     root         9573 Jul 28 19:03 mt-st*
  2024.        lrwxrwxrwx   1 root     root            6 Jul 28 19:05 rmmod -> insmod*
  2025.        -rwxr-xr-x   1 root     root       104085 Jul 28 19:05 tar*
  2026.        lrwxrwxrwx   1 root     root            5 Jul 29 21:35 vi -> elvis*
  2027.  
  2028.   H.2.  Shell Scripts to Build Diskettes
  2029.  
  2030.   These shell scripts are provided as examples only. I use them on my
  2031.   system to create rescue diskettes. You may find it convenient to use
  2032.   them, but if so, read the instructions carefully - for example, if you
  2033.   specify the wrong swap device, you will find your root filesystem has
  2034.   been throroughly and permanently erased.... so just be darn sure you
  2035.   have it correctly configured before you use it!
  2036.  
  2037.   The upside of the scripts are that they provide a quick way to get a
  2038.   rescue set together, by doing the following:
  2039.  
  2040.   ╖  copy a kernel to a bootdisk, and use rdev to configure it, as
  2041.      explained above.
  2042.  
  2043.   ╖  adjust mkroot to your system and build a root disk. Use the
  2044.      directory listing above as a guide to what to include.
  2045.  
  2046.   ╖  use mkutil to throw your favourite utilities onto one or more
  2047.      utility disks.
  2048.  
  2049.   There are two shell scripts:
  2050.  
  2051.   ╖  mkroot - builds a root or boot/root diskette.
  2052.  
  2053.   ╖  mkutil - builds a utility diskette.
  2054.  
  2055.   Both are currently configured to run in the parent directory of
  2056.   boot_disk and util_disk, each of which contains everything to be
  2057.   copied to it's diskette. Note that these shell scripts will *NOT*
  2058.   automatically set up and copy all the files for you - you work out
  2059.   which files are needed, set up the directories and copy the files to
  2060.   those directories. The shell scripts are samples which will copy the
  2061.   contents of those directories. Note that they are primitive shell
  2062.   scripts and are not meant for the novice user.
  2063.  
  2064.   The scripts both contain configuration variables at the start which
  2065.   allow them to be easily configured to run anywhere.  First, set up the
  2066.   model directories and copy all the required files into them. To see
  2067.   what directories and files are needed, have a look at the sample
  2068.   directory listings in the previous sections.
  2069.  
  2070.   Check the configuration variables in the shell scripts and change them
  2071.   as required before running the scripts.
  2072.  
  2073.   H.2.1.  mkroot - Make Root Diskette
  2074.  
  2075.   ______________________________________________________________________
  2076.   # mkroot: make a root disk - creates a root diskette
  2077.   #         by building a file system on it, then mounting it and
  2078.   #         copying required files from a model.
  2079.   #         Note: the model to copy from from must dirst be set up,
  2080.   #         then change the configuration variables below to suit
  2081.   #         your system.
  2082.   #
  2083.   # usage: mkroot [ -d swap | ram ]
  2084.   #       where swap means use $SWAPDEV swap device
  2085.   #       and ram means use $RAMDISKDEV ramdisk device
  2086.  
  2087.   # Copyright (c) Graham Chapman 1996. All rights reserved.
  2088.   # Permission is granted for this material to be freely
  2089.   # used and distributed, provided the source is acknowledged.
  2090.   # No warranty of any kind is provided. You use this material
  2091.   # at your own risk.
  2092.  
  2093.   # Configuration variables - set these to suit your system
  2094.   #
  2095.   ####  set the device to use to build the root filesystem on.
  2096.   ####  ramdisk is safer - swap is ok only if you have plenty of
  2097.   ####  free memory. If linux can't swap then things get nasty.
  2098.   USEDEVICE="ramdisk"             # set to either "ramdisk" or "swap"
  2099.   RAMDISKDEV="/dev/ram"           # ramdisk device <==== CHANGE if using ramdisk
  2100.   SWAPDEV="/dev/sda7"             # swap device    <==== CHANGE if using swap
  2101.   FSBLOCKS=3072                   # desired filesystem size in blocks
  2102.   #
  2103.   ####  set name or directory where you have set up your rootdisk
  2104.   ####  model
  2105.   ROOTDISKDIR="./root_disk"       # name of root disk directory
  2106.   MOUNTPOINT="/mnt"               # temporary mount point for diskette
  2107.   DISKETTEDEV="/dev/fd0"          # device name of diskette drive
  2108.   LOGFL="`pwd`/mkroot.log"        # log filename
  2109.   TEMPROOTFS="/tmp/mkrootfs.gz"   # temp file for compressed filesystem
  2110.   # End of Configuration variables
  2111.  
  2112.   # Internal variables
  2113.   ROOTDISKDEV=
  2114.  
  2115.   case $USEDEVICE in
  2116.   swap|ramdisk)   :;;
  2117.   *)      echo "Invalid setting for USEDEVICE variable"
  2118.           exit;;
  2119.   esac
  2120.  
  2121.   clear
  2122.   echo "    ***************** W A R N I N G ******************
  2123.  
  2124.   Use this script with care. If you don't understand it, then
  2125.   exit NOW!"
  2126.  
  2127.   if [ "$USEDEVICE" = "swap" ]
  2128.   then
  2129.           ROOTDISKDEV=$SWAPDEV
  2130.           echo -e "\nThis script will temporarily remove the swap file $SWAPDEV"
  2131.           echo "and use the space to build a compressed root filesystem from"
  2132.           echo "the files in the directory tree below $ROOTDISKDIR. To do this"
  2133.           echo "safely you must have 8Mb or more of memory, and you should"
  2134.           echo "switch to single user mode via 'init 1'."
  2135.           echo -e "\nIf you have used a ramdisk since the last reboot, then"
  2136.           echo "reboot NOW before using this script."
  2137.           echo -e "\nIf the script fails, you may not have a swap partition. Run 'free'"
  2138.           echo "and check the total size to see if it is correct. If the swap"
  2139.           echo "partition $SWAPDEV is missing, do the following:"
  2140.           echo "  umount $MOUNTPOINT"
  2141.           echo "  mkswap $SWAPDEV"
  2142.           echo "  swapon $SWAPDEV"
  2143.           echo "to restore the swap partition $SWAPDEV."
  2144.   else
  2145.           ROOTDISKDEV=$RAMDISKDEV
  2146.           echo -e "\nThis script will use a ramdisk of $FSBLOCKS Kb. To do this safely"
  2147.           echo "you must have at least 8Mb of memory. If you have only 8Mb you should"
  2148.           echo "ensure nothing else is running on the machine."
  2149.           echo -e "\nWhen the script is complete, the ramdisk will still be present, so"
  2150.           echo "you should reboot to reclaim the memory allocated to the ramdisk."
  2151.   fi
  2152.  
  2153.   echo -e "
  2154.   Do you want to continue (y/n)? \c"
  2155.   read ans
  2156.   if [ "$ans" != "Y" -a $ans != "y" ]
  2157.   then
  2158.           echo "not confirmed - aborting"
  2159.           exit
  2160.   fi
  2161.  
  2162.   echo "Starting mkroot at `date`" > $LOGFL
  2163.  
  2164.   if [ "$USEDEVICE" = "swap" ]
  2165.   then
  2166.           echo "Unmounting swap device $SWAPDEV" | tee -a $LOGFL
  2167.           swapoff $SWAPDEV >> $LOGFL 2>&1
  2168.   fi
  2169.  
  2170.   echo "Zeroing device $ROOTDISKDEV" | tee -a $LOGFL
  2171.   dd if=/dev/zero of=$ROOTDISKDEV bs=1024 count=$FSBLOCKS >> $LOGFL 2>&1
  2172.   if [ $? -ne 0 ]
  2173.   then
  2174.           echo "dd zeroing $ROOTDISKDEV failed" | tee -a $LOGFL
  2175.           exit 1
  2176.   fi
  2177.  
  2178.   echo "Creating filesystem on device $ROOTDISKDEV" | tee -a $LOGFL
  2179.   mke2fs -m0 $ROOTDISKDEV $FSBLOCKS >> $LOGFL 2>&1
  2180.  
  2181.   echo "Mounting $ROOTDISKDEV filesystem at $MOUNTPOINT" | tee -a $LOGFL
  2182.   mount -t ext2 $ROOTDISKDEV $MOUNTPOINT >> $LOGFL 2>&1
  2183.   if [ $? -ne 0 ]
  2184.   then
  2185.           echo "mount failed"
  2186.           exit 1
  2187.   fi
  2188.  
  2189.   # copy the directories containing files
  2190.   echo "Copying files from $ROOTDISKDIR to $MOUNTPOINT" | tee -a $LOGFL
  2191.   currdir=`pwd`
  2192.   cd $ROOTDISKDIR
  2193.   find . -print | cpio -dpumv $MOUNTPOINT >> $LOGFL 2>&1
  2194.   if [ $? -ne 0 ]
  2195.   then
  2196.           echo "cpio step failed."
  2197.           cd $currdir
  2198.           exit 1
  2199.   fi
  2200.   cd $currdir
  2201.  
  2202.   fssize=`du -sk $MOUNTPOINT|cut -d"      " -f1`
  2203.   echo "Uncompressed root filesystem size is $fssize Kb" | tee -a $LOGFL
  2204.   echo "Unmounting filesystem from $ROOTDISKDEV" | tee -a $LOGFL
  2205.   umount $MOUNTPOINT >> $LOGFL 2>&1
  2206.  
  2207.   echo "Compressing filesystem from $ROOTDISKDEV into $TEMPROOTFS
  2208.           This may take a few minutes..." | tee -a $LOGFL
  2209.  
  2210.   #       We don't bother with gzip -9 here - takes more than twice as long
  2211.   #       and saves less than 1% in space on my root disk...
  2212.   dd if=$ROOTDISKDEV bs=1024 count=$FSBLOCKS 2>>$LOGFL | gzip -c > $TEMPROOTFS
  2213.  
  2214.   fssize=`du -k $TEMPROOTFS|cut -d"       " -f1`
  2215.   echo "Compressed root filesystem size is $fssize Kb" | tee -a $LOGFL
  2216.  
  2217.   echo -e "Insert diskette in $DISKETTEDEV and press any key
  2218.           ***  Warning: data on diskette will be overwritten!\c"
  2219.   read ans
  2220.  
  2221.   echo "Copying compressed filesystem from $TEMPROOTFS to $DISKETTEDEV" | tee -a $LOGFL
  2222.   dd if=$TEMPROOTFS of=$DISKETTEDEV >>$LOGFL 2>&1
  2223.   if [ $? -ne 0 ]
  2224.   then
  2225.           echo "copy step failed."
  2226.           exit 1
  2227.   fi
  2228.  
  2229.   if [ "$USEDEVICE" = "swap" ]
  2230.   then
  2231.           echo "Reinitialising swap device $SWAPDEV" | tee -a $LOGFL
  2232.           mkswap $SWAPDEV >> $LOGFL 2>&1
  2233.           echo "Starting swapping to swap device $SWAPDEV" | tee -a $LOGFL
  2234.           swapon $SWAPDEV >> $LOGFL 2>&1
  2235.   fi
  2236.  
  2237.   echo "Deleting $TEMPROOTFS" | tee -a $LOGFL
  2238.   rm $TEMPROOTFS
  2239.  
  2240.   echo "mkroot completed at `date`" >> $LOGFL
  2241.  
  2242.   echo "Root diskette creation complete - please read log file $LOGFL"
  2243.   ______________________________________________________________________
  2244.  
  2245.   H.2.2.  mkutil - Make Utility Diskette
  2246.  
  2247.   ______________________________________________________________________
  2248.   # mkutil: make a utility diskette - creates a utility diskette
  2249.   #         by building a file system on it, then mounting it and
  2250.   #         copying required files from a model.
  2251.   #         Note: the model to copy from from must first be set up,
  2252.   #         then change the configuration variables below to suit
  2253.   #         your system.
  2254.  
  2255.   # Copyright (c) Graham Chapman 1996. All rights reserved.
  2256.   # Permission is granted for this material to be freely
  2257.   # used and distributed, provided the source is acknowledged.
  2258.   # No warranty of any kind is provided. You use this material
  2259.   # at your own risk.
  2260.  
  2261.   # Configuration variables...
  2262.   UTILDISKDIR=./util_disk         # name of directory containing model
  2263.   MOUNTPOINT=/mnt                 # temporary mount point for diskette
  2264.   DISKETTEDEV=/dev/fd0            # device name of diskette drive
  2265.  
  2266.   echo $0: create utility diskette
  2267.   echo Warning: data on diskette will be overwritten!
  2268.   echo Insert diskette in $DISKETTEDEV and and press any key...
  2269.   read anything
  2270.  
  2271.   mke2fs $DISKETTEDEV
  2272.   if [ $? -ne 0 ]
  2273.   then
  2274.           echo mke2fs failed
  2275.           exit
  2276.   fi
  2277.  
  2278.   # Any file system type would do here
  2279.   mount -t ext2 $DISKETTEDEV $MOUNTPOINT
  2280.   if [ $? -ne 0 ]
  2281.   then
  2282.           echo mount failed
  2283.           exit
  2284.   fi
  2285.  
  2286.   # copy the directories containing files
  2287.   cp -dpr $UTILDISKDIR/* $MOUNTPOINT
  2288.  
  2289.   umount $MOUNTPOINT
  2290.  
  2291.   echo Utility diskette complete
  2292.   ______________________________________________________________________
  2293.  
  2294.